Pot citi numerele și operațiunea cu:
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
dar apoi toate încercările mele de a adăuga numerele eșuează:
case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac
Run:
First number please 1 Second mumber please 2 Operation? +
Ieșire:
num1+num2
… sau …
echo $num1+$num2;; # results in: 1+2
… sau. ..
echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found
Se pare că primesc șiruri încă probabil când încerc să adaug add („2 + 2” în loc de „4”).
Comentarii
Răspuns
Aritmetica în shell-urile POSIX se realizează cu $
și paranteze duble (( ))
:
echo "$(($num1+$num2))"
Puteți atribui din asta (sans echo
):
num1="$(($num1+$num2))"
Există și expr
:
expr $num1 + $num2
În scripturi $(())
este de preferat deoarece evită o bifurcare / executare pentru comanda expr
.
Comentarii
- Sau chiar direct
echo $(($num1$op$num2))
fără a implicacase
. - Acolo ' s nu
case
implicat aici. - Nu, dar ați folosit
+
literal, deci veți avea nevoie decase
afară pentru a gestiona scăderea separat. - @manatwork: n eliminați
case
din codul OP ' cuecho $(($num1$op$num2))
– care va funcționa , dar utilizareacase
este mai robustă, deoarece puteți gestiona erorile cu un*
implicit. - +1 la amandoi. Foloseam majuscule (poate că nu l-am arătat la început), dar pe măsură ce v-ați dat seama amândoi, problema nu era ' despre caz.
Răspuns
Răspunsul existent este bash pur, deci va fi mai rapid decât acesta, dar poate gestiona numai numere întregi. Dacă aveți nevoie să gestionați flotări, trebuie să utilizați programul extern bc
.
$ echo "scale=4;3.1415+9.99" | bc 13.1315
scale=4
îi spune bc
să utilizeze patru zecimale. Consultați man bc
pentru mai multe informații.
Comentarii
- Rețineți că în timp ce
bash
nu ' nu acceptă aritmetica în virgulă mobilă cu$((...))
, multe cochilii (ksh93
,zsh
,yash
cel puțin) faceți. Avantajulbc
este că acceptă precizie arbitrară, în timp ce aritmetica shell este limitată la procesorul ' sdouble
tip. Rețineți că nu ' nu trebuie să setațiscale
aici. Pentru adăugiri, parametrulscale
nu este utilizat. Scara3.1415+9.99
va fi derivată din cea a operanzilor (aici 4). - Cum se face matematica dacă o valoare este
450
, iar cealaltă este zecimală stocată pe o variabilă$mynumber
? De exemplu,450-$mynumber
. - @sigur
echo "450-$mynumber" | bc
ar trebui să o facă. Dacă doriți ca o variabilă să se extindă, trebuie să folosiți ghilimele duble mai degrabă decât ghilimelele simple. - @evilsoup, acum funcționează ca un farmec. Mulțumim.
-
computedval=$(echo 'scale=10;var1-var2' | bc)
nu funcționează ' și nicicomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Răspuns
Puteți utiliza și structura $[ ... ]
. În acest caz, folosim mecanism încorporat în Bash, care este mai rapid și puțin mai convenabil de utilizat. Deoarece știm că totul dintre $ [și] este tratat ca o expresie, nu trebuie să precedăm variabilele cu $
. În mod similar, nu trebuie să securizăm *
de la tratarea acestuia ca un model.
num1=2 num2=3 echo $[num1 + num2] 5
Răspuns
echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b`
Rețineți \
înainte de *
(pentru înmulțire), întreaga expresie trebuie să se afle în ghilimele „.
Comentarii
-
expr
nu este necesar și ' nu este niciodată necesar pentru a captura ieșirea standard a unei comenzi doar pentru a o scrie înapoi la ieșirea standard.
Răspuns
minimalist
total=0 ((total+=qty))
Răspuns
Pe baza secvenței de intrări pe care o solicitați utilizatorului , se pare că utilizați notația poloneză inversă.
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
Puteți face mai bine doar să utilizați direct dc
(calculatorul de birou), întrucât pentru asta este.
DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic.
E sesiune xample folosind dc
:
$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $
Sau, fără interacțiune:
$ dc -e "1 2 + p" 3 $
case
sau orice altceva, cu excepția unei linii:echo $num+$num
, deoarece va reproduce problema exact . Ideea cu minimizarea contextul în programarea întrebărilor este explicat aici: sscce.org