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
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 involveracase. - Där ' s ingen
caseinblandad här. - Nej, men du använde bokstavligt
+, så kommer att behövacaseutanför för att hantera subtraktionen separat. - @manatwork: Du betyder n eliminera
casefrån OP ' s kod medecho $(($num1$op$num2))– det fungerar , men att användacaseä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
bashstöder inte ' t stöd för flytpunktsräkning med$((...)), många skal (ksh93,zsh,yashåtminstone) gör. Fördelen medbcär att den stöder godtycklig precision medan skal-aritmetik är begränsad till processorn ' sdoubletyp. Observera att du inte behöver ' inte behöver ställa inscalehär. För tillägg används parameternscale. Skalan för3.1415+9.99kommer att härledas från operandernas (här 4). - Hur man gör matematiken om ett värde är
450och den andra är decimal lagrad på en variabel$mynumber? Till exempel bör450-$mynumber. - @sigur
echo "450-$mynumber" | bcgö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 hellercomputedval=$(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 $
caseeller 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