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 è
case
coinvolto qui. - No, ma hai utilizzato
+
letterale, quindi sarà necessario ilcase
allesterno per gestire la sottrazione separatamente. - @manatwork: You mea n eliminare il
case
dal 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
bash
non ' t supporta laritmetica in virgola mobile con$((...))
, molte shell (ksh93
,zsh
,yash
almeno) fallo. Il vantaggio dibc
è che supporta la precisione arbitraria mentre laritmetica della shell è limitata al processore ' sdouble
tipo. Tieni presente che ' non è necessario impostarescale
qui. Per le aggiunte, il parametroscale
non viene utilizzato. La scala di3.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 $
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