Be tudom olvasni a számokat és a műveletet a következővel:
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
de akkor minden sikertelen kísérleteim a számok hozzáadására:
case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac
Futtatás:
First number please 1 Second mumber please 2 Operation? +
Kimenet:
num1+num2
… vagy …
echo $num1+$num2;; # results in: 1+2
… vagy. ..
echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found
Úgy tűnik, hogy még mindig húrokat kapok, amikor megpróbálom hozzáadni az add (“2” és “2” helyett “4” -t).
Megjegyzések
Válasz
A számtan a POSIX héjakban a $ és a dupla zárójelekkel (( )):
echo "$(($num1+$num2))"
Ebből rendelhet (sans echo):
num1="$(($num1+$num2))"
Van még expr:
expr $num1 + $num2
A szkriptekben $(()) előnyösebb, mivel elkerüli az elágazást / végrehajtást a expr parancsnál.
Megjegyzések
- Vagy akár közvetlenül
echo $(($num1$op$num2))anélkül, hogy bevonnácase. - Ott ' s nem
caseérintett itt. - Nem, de a literal
+szót használta, ezért szüksége lesz acasekívülről, hogy külön kezelje a kivonást. - @manatwork: Mea n szüntesse meg a
case-t az OP ' OP kódbólecho $(($num1$op$num2))-vel – ez működni fog , de acasehasználata robusztusabb, mivel a hibákat alapértelmezett*használatával kezelheti. - +1 mindketten. Case-t használtam (lehet, hogy az elején nem mutattam volna meg), de mivel mindketten rájöttek, a probléma nem ' volt az eset kapcsán.
Válasz
A meglévő válasz tiszta bash, tehát ennél gyorsabb lesz, de csak egész számokat képes kezelni. Ha úszókat kell kezelnie, akkor a bc külső programot kell használnia.
$ echo "scale=4;3.1415+9.99" | bc 13.1315
A scale=4 megadja a bc négy tizedesjegy használatát. További információ: man bc.
Megjegyzések
- Ne feledje, hogy míg
bashnem ' nem támogatja a lebegőpontos aritmetikát$((...)), sok kagylóval (ksh93,zsh,yashlegalábbis). Abcelőnye, hogy tetszőleges pontosságot támogat, míg a shell aritmetika csak a processzorra korlátozódik ' sdoubletípusú. Ne feledje, hogy nem kell ' itt beállítania ascalebeállítást. A kiegészítésekhez ascaleparamétert nem használják. A3.1415+9.99skála az operandusok skálájából származik (itt 4). - Hogyan kell elvégezni a matematikát, ha az egyik érték
450és a másik tizedesjegyű a$mynumberváltozóban? Például:450-$mynumber. - @sigur
echo "450-$mynumber" | bcmeg kell tennie. Ha egy változó kibővül, dupla idézőjeleket kell használnia, nem pedig egyes idézőjeleket. - @evilsoup, most varázslatként működik. Köszönet.
-
computedval=$(echo 'scale=10;var1-var2' | bc)nem működik, ' nem működik, és nem működikcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Válasz
Használhatja a $[ ... ] struktúrát is. Ebben az esetben a Bash-ban beépített mechanizmust használunk, amely gyorsabb és valamivel kényelmesebb a használata. Mivel tudjuk, hogy a $ [, és] között mindent kifejezésként kezelünk, nem kell a változókat megelőznünk a $ jellel. Hasonlóképpen, nem kell a * attól, hogy mintaként kezelje.
num1=2 num2=3 echo $[num1 + num2] 5
Válasz
echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b`
Vegye figyelembe a \ -et a * előtt (szorzáshoz), az egész kifejezésnek a back quote-okon belül kell lennie.
Megjegyzések
-
exprnem szükséges, és ' soha A parancs normál kimenetének rögzítéséhez csak a normál kimenetre való visszaíráshoz van szükség.
Válasz
minimalista
total=0 ((total+=qty))
Válasz
A felhasználótól kért bemenetek sorrendje alapján , úgy tűnik, hogy fordított lengyel jelölést használ.
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
Jobban járhat, ha közvetlenül használja a dc (asztali számológép) alkalmazást, mivel erre szolgál.
DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic.
E xample munkamenet a dc használatával:
$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $
Vagy nem interaktív módon:
$ dc -e "1 2 + p" 3 $
casevagy bármi, kivéve egy sort:echo $num+$num, mivel az pontosan megismétli a problémát . A programozási kérdések kontextusát itt magyarázzuk el: sscce.org