cum pot adăuga (scădea etc.) două numere cu bash?

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

  • Am editat titlul dvs., deoarece aceasta este o întrebare generală bună și, dacă ați restrânge contextul, v-ați fi dat seama că acest lucru nu are nimic de-a face cu 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
  • +1 Bună, blocuri de aur, da, care mi-a devenit clar după aceea, dar da, eu totall sunteți de acord cu raționamentul dvs. și da, cu cât o întrebare este mai specifică și ' singular ' Salut modificările dvs. 🙂 Vă mulțumesc 🙂

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 implica case.
  • Acolo ' s nu case implicat aici.
  • Nu, dar ați folosit + literal, deci veți avea nevoie de case afară pentru a gestiona scăderea separat.
  • @manatwork: n eliminați case din codul OP ' cu echo $(($num1$op$num2)) – care va funcționa , dar utilizarea case 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. Avantajul bc este că acceptă precizie arbitrară, în timp ce aritmetica shell este limitată la procesorul ' s double tip. Rețineți că nu ' nu trebuie să setați scale aici. Pentru adăugiri, parametrul scale nu este utilizat. Scara 3.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 nici computedval=$(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 $ 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *