hogyan adhatok hozzá (vonhatok ki stb.) két számot bash-val?

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

  • Azért szerkesztettem a címét, mert ez jó általános kérdés, és ha leszűkítené a kontextust, rájött volna, hogy ennek semmi köze case vagy 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
  • +1 Szia aranyfürtök, igen, ez utólag világossá vált számomra, de igen teljes y egyetértesz az érveléseddel, és igen, a konkrétabb és ' egyes számú ' kérdés annál jobb. Üdvözlöm szerkesztésedet 🙂 Köszönöm 🙂

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 a case kí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ól echo $(($num1$op$num2)) -vel – ez működni fog , de a case haszná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 bash nem ' nem támogatja a lebegőpontos aritmetikát $((...)), sok kagylóval (ksh93, zsh, yash legalábbis). A bc előnye, hogy tetszőleges pontosságot támogat, míg a shell aritmetika csak a processzorra korlátozódik ' s double típusú. Ne feledje, hogy nem kell ' itt beállítania a scale beállítást. A kiegészítésekhez a scale paramétert nem használják. A 3.1415+9.99 ská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 $mynumber változóban? Például: 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc meg 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ödik computedval=$(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

  • expr nem 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 $ 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük