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
case
inblandad här. - Nej, men du använde bokstavligt
+
, så kommer att behövacase
utanför för att hantera subtraktionen separat. - @manatwork: Du betyder n eliminera
case
frå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
bash
stö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 ' sdouble
typ. Observera att du inte behöver ' inte behöver ställa inscale
här. För tillägg används parameternscale
. Skalan för3.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ör450-$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 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 $
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