come posso aggiungere (sottrarre, ecc.) due numeri con bash?

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

  • Ho modificato il tuo titolo perché questa è una buona domanda generale, e se restringessi il contesto avresti capito che non ha nulla a che fare con case o 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
  • +1 Ciao riccioli doro, sì, mi è stato chiaro in seguito, ma sì, io totall Sei daccordo con il tuo ragionamento e sì, più specifica e ' singolare ' è una domanda, meglio è. Accolgo con favore le tue modifiche 🙂 Grazie 🙂

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 coinvolgere case.
  • Lì ' non è case coinvolto qui.
  • No, ma hai utilizzato + letterale, quindi sarà necessario il case allesterno per gestire la sottrazione separatamente.
  • @manatwork: You mea n eliminare il case dal codice ' dellOP con echo $(($num1$op$num2)) – che funzionerà , ma lutilizzo di case è 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 bash non ' t supporta laritmetica in virgola mobile con $((...)), molte shell (ksh93, zsh, yash almeno) fallo. Il vantaggio di bc è che supporta la precisione arbitraria mentre laritmetica della shell è limitata al processore ' s double tipo. Tieni presente che ' non è necessario impostare scale qui. Per le aggiunte, il parametro scale non viene utilizzato. La scala di 3.1415+9.99 sarà derivata da quella degli operandi (qui 4).
  • Come fare i calcoli se un valore è 450 e laltro è un numero decimale memorizzato su una variabile $mynumber? Ad esempio, 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc dovrebbe 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

  • expr non è 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 $ 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *