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?
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:
Sì, puoi usare l'espansione aritmetica incorporata di bash$(( ))
per fare alcuni semplici calcoli
$ echo "$((5 * 5))"
25
Controllare la sezione Aritmetica della shell nel Manuale di riferimento di Bash per un elenco completo degli operatori.
Per ragioni di completezza, come altri hanno sottolineato, se hai bisogno di una precisione arbitraria, bc
o dc
sarebbe meglio.
Bash supporta l'espansione aritmetica con $(( expression ))
. Per esempio:
$ echo $(( 5 * 5 ))
25
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
La soluzione classica è:
expr 5 \* 5
Un'altra bella opzione è:
echo 5 5\*p | dc
Entrambe queste soluzioni funzioneranno solo con operandi interi.
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?
dc
raramente 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 man
pagina di FreeBSD (1993) menziona il valore predefinito zero, ma le man
pagine BSD più vecchie no.
echo '4 k 50.5 7 / p' | dc
funziona (output :) 7.2142
.
Uso questa funzione che utilizza bc
e 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
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 x
in *
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).tr
può essere utilizzato per eseguire la mappatura dei caratteri per più caratteri.
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
dc
funziona con i galleggianti. Provaecho '4 k 50 7 / p' | dc
. L'output è7.1428
. Ilk
comando imposta la precisione.