hur kan jag lägga till (subtrahera osv.) två nummer med bash?

Jag kan läsa siffrorna och operationen med:

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

men sedan alla mina försök att lägga till siffrorna misslyckas:

case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac 

Kör:

First number please 1 Second mumber please 2 Operation? + 

Output:

num1+num2 

… eller …

echo $num1+$num2;; # results in: 1+2 

… eller. ..

echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found 

Det verkar som om jag fortfarande får strängar kanske när jag försöker lägga till add (”2 + 2” istället för ”4”).

Kommentarer

  • Jag redigerade din titel eftersom det här är en bra allmän fråga, och om du minskat sammanhanget skulle du ha insett att detta inte har något att göra case eller något annat än en rad: echo $num+$num, eftersom det kommer att återge problemet exakt . Idén med minimering sammanhang i programmeringsfrågor förklaras här: sscce.org
  • +1 Hej guldlås, ja det blev klart för mig efteråt, men ja jag totalt y håller med din resonemang och ja, ju mer specifika och ' singular ' är en fråga desto bättre. Jag välkomnar dina ändringar 🙂 Tack 🙂

Svar

Aritmetik i POSIX-skal görs med $ och dubbla parenteser (( )):

echo "$(($num1+$num2))" 

Du kan tilldela från det (sans echo):

num1="$(($num1+$num2))" 

Det finns också expr:

expr $num1 + $num2 

I skript $(()) är att föredra eftersom det undviker en gaffel / körning för kommandot expr.

Kommentarer

  • Eller till och med direkt echo $(($num1$op$num2)) utan att involvera case.
  • Där ' s ingen case inblandad här.
  • Nej, men du använde bokstavligt +, så kommer att behöva case utanför för att hantera subtraktionen separat.
  • @manatwork: Du betyder n eliminera case från OP ' s kod med echo $(($num1$op$num2)) – det fungerar , men att använda case är mer robust eftersom du kan hantera fel med en standard *.
  • +1 till båda två. Jag använde fall (kanske inte visade det i början) men när ni båda insåg problemet handlade det inte om ' om ärendet.

Svar

Det befintliga svaret är rent bash, så det blir snabbare än detta, men det kan bara hantera heltal. Om du behöver hantera flottörer måste du använda det externa programmet bc.

$ echo "scale=4;3.1415+9.99" | bc 13.1315 

scale=4 säger till bc att använda fyra decimaler. Se man bc för mer information.

Kommentarer

  • Observera att medan bash stöder inte ' t stöd för flytpunktsräkning med $((...)), många skal (ksh93, zsh, yash åtminstone) gör. Fördelen med bc är att den stöder godtycklig precision medan skal-aritmetik är begränsad till processorn ' s double typ. Observera att du inte behöver ' inte behöver ställa in scale här. För tillägg används parametern scale. Skalan för 3.1415+9.99 kommer att härledas från operandernas (här 4).
  • Hur man gör matematiken om ett värde är 450 och den andra är decimal lagrad på en variabel $mynumber? Till exempel bör 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc göra det. Om du vill att en variabel ska expanderas måste du använda dubbla citat snarare än enstaka citat.
  • @evilsoup, nu fungerar det som en charm. Tack.
  • computedval=$(echo 'scale=10;var1-var2' | bc) fungerar inte ' t, inte heller computedval=$(echo 'scale=10;$var1-$var2' | bc)

Svar

Du kan också använda $[ ... ] struktur. I det här fallet använder vi inbyggd mekanism i Bash, vilket är snabbare och lite bekvämare att använda. Eftersom vi vet att allt mellan $ [, och] behandlas som ett uttryck behöver vi inte föregå variablerna med $. På samma sätt behöver vi inte säkra * från att behandla det som ett mönster.

num1=2 num2=3 echo $[num1 + num2] 5 

Svar

echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b` 

Observera \ före * (för multiplikation), hela uttrycket måste ligga inom backcitaten `.

Kommentarer

  • expr är inte nödvändigt och det ' är aldrig nödvändigt för att fånga standardutdata för ett kommando bara för att skriva tillbaka det till standardutdata.

Svar

minimalistisk

total=0 ((total+=qty)) 

Svar

Baserat på den ingångssekvens du begär från användaren , det verkar som att du använder omvänd polsk notation.

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

Du kan göra bättre bara att använda dc (skrivbordskalkylator) direkt, eftersom det är vad det är för.

DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic. 

E Exempelsession med dc:

$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $ 

Eller, icke-interaktivt:

$ dc -e "1 2 + p" 3 $ 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *