Moltiplicazione sul terminale della riga di comando


115

Sto usando un terminale seriale per fornire input al nostro esperimento di laboratorio. L'ho scoperto usando

$ echo "5X5"

restituisce solo una stringa di "5X5". Esiste un comando per eseguire un'operazione di moltiplicazione?

Risposte:



45

Per una matematica più avanzata e precisa, considera l'utilizzo di bc (1).

echo "3 * 2.19" | bc -l 
6.57

19

Metodi interni

Bash supporta l'espansione aritmetica con $(( expression )). Per esempio:

$ echo $(( 5 * 5 ))
25

Metodi esterni

Un certo numero di utilità forniscono dati aritmetici, inclusi bc ed expr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25

15

La soluzione classica è:

 expr 5 \* 5

Un'altra bella opzione è:

 echo 5 5\*p | dc

Entrambe queste soluzioni funzioneranno solo con operandi interi.


1
dcfunziona con i galleggianti. Prova echo '4 k 50 7 / p' | dc. L'output è 7.1428. Il kcomando imposta la precisione.
In pausa fino a nuovo avviso.

@Dennis In due diverse implementazioni di dc, vedo che le operazioni float funzionano senza assegnare tramite k. Ricordo certamente che la precisione predefinita era 0 (troncamento a numero intero). Sto ricordando male o è semplicemente che le nuove implementazioni hanno cambiato il comportamento?
William Pursell

Ho usato solo dcraramente nel corso degli anni poiché sono più algebrico e meno RPN, quindi non ricordo. Su un sistema GNU che sto usando, il valore predefinito è 0. Una vecchia manpagina di FreeBSD (1993) menziona il valore predefinito zero, ma le manpagine BSD più vecchie no.
In pausa fino a nuovo avviso.

A proposito (per i lettori futuri), il mio esempio avrebbe dovuto mostrare operandi non interi invece del solo risultato non intero per contrastare accuratamente l'asserzione. Non temere, echo '4 k 50.5 7 / p' | dcfunziona (output :) 7.2142.
In pausa fino a nuovo avviso.

8

Una semplice funzione di shell (non è necessario sed) dovrebbe fare il trucco di interpretare '5X5'

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25

6

Uso questa funzione che utilizza bce quindi supporta i calcoli in virgola mobile:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Esempio:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

L'espansione aritmetica di Bash non supporta i float (ma la shell Korn e zsh lo fanno).

Esempio:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75

4

Ho un semplice script che uso per questo:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Cambia xin *poiché *è un carattere speciale nella shell. Usalo come segue:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (devi ancora usare le virgolette se l'espressione contiene parentesi).

Mi piace la tua idea di usare una "x" per la moltiplicazione. Allo stesso modo potresti usare le parentesi quadre invece delle parentesi per evitare la necessità di citazioni. trpuò essere utilizzato per eseguire la mappatura dei caratteri per più caratteri.
In pausa fino a nuovo avviso.

3

Se ti piace Python e hai un'opzione per installare un pacchetto, puoi usare questa utility che ho creato.

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.