Riesco a leggere i numeri e le operazioni con:
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
ma poi tutto i miei tentativi di aggiungere i numeri falliscono:
case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac
Esegui:
First number please 1 Second mumber please 2 Operation? +
Risultato:
num1+num2
… o …
echo $num1+$num2;; # results in: 1+2
… o. ..
echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found
Sembra che “stia ancora ottenendo stringhe forse quando provo ad aggiungere add (” 2 + 2 “invece di” 4 “).
Commenti
Risposta
Laritmetica nelle shell POSIX viene eseguita con $ e doppie parentesi (( )):
echo "$(($num1+$num2))"
Puoi assegnare da quello (sans echo):
num1="$(($num1+$num2))"
Cè anche expr:
expr $num1 + $num2
Nello script $(()) è preferibile poiché evita un fork / execute per il comando expr.
Commenti
- O anche direttamente
echo $(($num1$op$num2))senza coinvolgerecase. - Lì ' non è
casecoinvolto qui. - No, ma hai utilizzato
+letterale, quindi sarà necessario ilcaseallesterno per gestire la sottrazione separatamente. - @manatwork: You mea n eliminare il
casedal codice ' dellOP conecho $(($num1$op$num2))– che funzionerà , ma lutilizzo dicaseè più affidabile poiché puoi gestire gli errori con un*predefinito. - +1 a entrambi. Stavo usando il caso (potrebbe non averlo mostrato allinizio) ma poiché entrambi avete capito che il problema non era ' relativo al caso.
Risposta
La risposta esistente è pura bash, quindi sarà più veloce di questa, ma può gestire solo numeri interi. Se devi gestire i float, devi utilizzare il programma esterno bc.
$ echo "scale=4;3.1415+9.99" | bc 13.1315
Il scale=4 dice a bc di utilizzare quattro cifre decimali. Vedi man bc per ulteriori informazioni.
Commenti
- Tieni presente che mentre
bashnon ' t supporta laritmetica in virgola mobile con$((...)), molte shell (ksh93,zsh,yashalmeno) fallo. Il vantaggio dibcè che supporta la precisione arbitraria mentre laritmetica della shell è limitata al processore ' sdoubletipo. Tieni presente che ' non è necessario impostarescalequi. Per le aggiunte, il parametroscalenon viene utilizzato. La scala di3.1415+9.99sarà derivata da quella degli operandi (qui 4). - Come fare i calcoli se un valore è
450e laltro è un numero decimale memorizzato su una variabile$mynumber? Ad esempio,450-$mynumber. - @sigur
echo "450-$mynumber" | bcdovrebbe farlo. Se vuoi espandere una variabile devi usare virgolette doppie anziché virgolette singole. - @evilsoup, ora funziona come un incantesimo. Grazie.
-
computedval=$(echo 'scale=10;var1-var2' | bc)' non funziona, nécomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Risposta
Puoi anche utilizzare la struttura $[ ... ]. In questo caso, utilizziamo il meccanismo integrato in Bash, che è più veloce e un po più comodo da usare. Poiché sappiamo che tutto ciò che è compreso tra $ [e] è trattato come unespressione, non è necessario che le variabili precedano $. Allo stesso modo, non è necessario proteggere * dal trattarlo come uno schema.
num1=2 num2=3 echo $[num1 + num2] 5
Risposta
echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b`
Nota il \ prima di * (per la moltiplicazione), lintera espressione deve essere tra le virgolette “.
Commenti
-
exprnon è necessario e ' non è mai necessario per acquisire loutput standard di un comando solo per riscriverlo sullo standard output.
Answer
minimalista
total=0 ((total+=qty))
Risposta
In base alla sequenza di input che richiedi allutente , sembra che tu stia utilizzando la notazione polacca inversa.
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
È meglio usare direttamente dc (calcolatrice da tavolo), poiché è a questo scopo.
DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic.
E xample sessione utilizzando dc:
$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $
Oppure, in modo non interattivo:
$ dc -e "1 2 + p" 3 $
caseo qualsiasi altra cosa tranne una riga:echo $num+$num, poiché riprodurrà esattamente il problema . Lidea di ridurre a icona il contesto nelle domande di programmazione è spiegato qui: sscce.org