hvordan kan jeg legge til (trekke osv.) to tall med bash?

Jeg kan lese tallene og operasjonen i med:

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

men så alle mine forsøk på å legge til tallene mislykkes:

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

Kjør:

First number please 1 Second mumber please 2 Operation? + 

Utgang:

num1+num2 

… eller …

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

… eller. ..

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

Ser ut som om jeg får strengene fremdeles kanskje når jeg prøver å legge til («2 + 2» i stedet for «4»).

Kommentarer

  • Jeg redigerte tittelen din fordi dette er et godt generelt spørsmål, og hvis du begrenset sammenhengen ville du ha innsett at dette ikke har noe å gjøre med case eller annet enn en linje: echo $num+$num, siden vil gjengi problemet nøyaktig . Ideen med å minimere sammenheng i programmeringsspørsmål blir forklart her: sscce.org
  • +1 Hei gullsperrer, ja det ble klart for meg etterpå, men ja jeg totalt y er enig med resonnementet og ja, jo mer spesifikt og ' entall ' er et spørsmål jo bedre. Jeg ønsker redigeringene dine 🙂 Takk 🙂

Svar

Regning i POSIX-skjell gjøres med $ og doble parenteser (( )):

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

Du kan tilordne fra det (sans echo):

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

Det er også expr:

expr $num1 + $num2 

I skript $(()) er å foretrekke siden den unngår en gaffel / utføring for expr -kommandoen.

Kommentarer

  • Eller til og med direkte echo $(($num1$op$num2)) uten å involvere case.
  • Der ' s ingen case involvert her.
  • Nei, men du brukte bokstavelig +, så trenger case utenfor for å håndtere subtraksjonen separat.
  • @manatwork: You mea n eliminere case fra OP ' s kode med echo $(($num1$op$num2)) – som vil fungere , men å bruke case er mer robust siden du kan håndtere feil med standard *.
  • +1 til begge to. Jeg brukte sak (kanskje ikke vist det i starten), men da dere begge skjønte, handlet problemet ikke om ' saken.

Svar

Det eksisterende svaret er rent bash, så det vil være raskere enn dette, men det kan bare håndtere heltall. Hvis du trenger å håndtere flottører, må du bruke det eksterne programmet bc.

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

scale=4 forteller bc å bruke fire desimaler. Se man bc for mer informasjon.

Kommentarer

  • Merk at mens bash støtter ikke ' t støtte flytende punktsaritmetikk med $((...)), mange skjell (ksh93, zsh, yash i det minste) gjør. Fordelen med bc er at den støtter vilkårlig presisjon mens skallaritmetikk er begrenset til prosessoren ' s double type. Merk at du ikke ' ikke trenger å angi scale her. For tillegg brukes ikke parameteren scale. Skalaen til 3.1415+9.99 vil bli avledet fra operandens (her 4).
  • Slik gjør du matematikken hvis en verdi er 450 og den andre er desimal lagret på en variabel $mynumber? For eksempel skal 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc gjøre det. Hvis du vil at en variabel skal utvides, må du bruke dobbelt anførselstegn i stedet for enkelt anførselstegn.
  • @evilsoup, nå fungerer det som en sjarm. Takk.
  • computedval=$(echo 'scale=10;var1-var2' | bc) fungerer ikke ' t, heller ikke computedval=$(echo 'scale=10;$var1-$var2' | bc)

Svar

Du kan også bruke $[ ... ] struktur. I dette tilfellet bruker vi innebygd mekanisme i Bash, som er raskere og litt mer praktisk å bruke. Siden vi vet at alt mellom $ [, og] behandles som et uttrykk, trenger vi ikke å gå foran variablene med $. Tilsvarende trenger vi ikke sikre * fra å behandle det som et 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` 

Legg merke til \ før * (for multiplikasjon), hele uttrykket må ligge i backquotes `.

Kommentarer

  • expr er ikke nødvendig, og det ' er aldri nødvendig for å fange standardutgangen til en kommando bare for å skrive den tilbake til standardutdata.

Svar

minimalistisk

total=0 ((total+=qty)) 

Svar

Basert på sekvensen av innganger du ber om fra brukeren , det ser ut til at du bruker omvendt polsk notasjon.

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

Det kan hende du gjør det bedre bare å bruke dc (bordkalkulator) direkte, siden det er det den er til.

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

E eksempeløkt ved hjelp av dc:

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

Eller ikke-interaktivt:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *