hvordan kan jeg tilføje (trække osv.) to tal med bash?

Jeg kan læse numrene og operationen med:

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

men så alle mine forsøg på at tilføje numrene mislykkes:

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 ser ud til, at jeg stadig får strenge, når jeg prøver at tilføje add (“2 + 2” i stedet for “4”).

Kommentarer

  • Jeg redigerede din titel, fordi dette er et godt generelt spørgsmål, og hvis du indsnævrede konteksten, ville du have indset, at dette ikke har noget at gøre med case eller andet end en linje: echo $num+$num, da gengiver problemet nøjagtigt . Ideen med minimering kontekst i programmeringsspørgsmål forklares her: sscce.org
  • +1 Hej guldlåse, ja det blev klart for mig bagefter, men ja jeg i alt y er enig med din ræsonnement og ja, jo mere specifikt og ' ental ' et spørgsmål er jo bedre. Jeg byder din redigering (er) velkommen 🙂 Tak 🙂

Svar

Aritmetik i POSIX-skaller udføres med $ og dobbelte parenteser (( )):

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

Du kan tildele fra det (sans echo):

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

Der er også expr:

expr $num1 + $num2 

I scripting $(()) foretrækkes, da den undgår en fork / execute til expr kommandoen.

Kommentarer

  • Eller endda direkte echo $(($num1$op$num2)) uden at involvere case.
  • Der ' s ingen case involveret her.
  • Nej, men du brugte bogstaveligt +, så du skal bruge case udenfor for at håndtere subtraktionen separat.
  • @manatwork: Du betyder n fjern case fra OP ' s kode med echo $(($num1$op$num2)) – det fungerer , men at bruge case er mere robust, da du kan håndtere fejl med en standard *.
  • +1 til jer begge to. Jeg brugte sag (muligvis ikke vist det i starten), men da I begge indså, var problemet ikke ' t om sagen.

Svar

Det eksisterende svar er rent bash, så det vil være hurtigere end dette, men det kan kun håndtere heltal. Hvis du har brug for at håndtere floats, skal du bruge det eksterne program bc.

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

scale=4 fortæller bc at bruge fire decimaler. Se man bc for at få flere oplysninger.

Kommentarer

  • Bemærk, at mens bash understøtter ikke ' t understøtter flydende aritmetik med $((...)), mange skaller (ksh93, zsh, yash i det mindste) gør. Fordelen ved bc er, at den understøtter vilkårlig præcision, mens shell-aritmetik er begrænset til processoren ' s double type. Bemærk, at du ikke ' behøver at indstille scale her. Til tilføjelser anvendes parameteren scale. Skalaen for 3.1415+9.99 stammer fra operandernes (her 4).
  • Sådan gør du matematikken, hvis en værdi er 450 og den anden er decimal gemt på en variabel $mynumber? For eksempel skal 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc gøre det. Hvis du vil have en variabel til at udvide, skal du bruge dobbelt anførselstegn i stedet for enkelt anførselstegn.
  • @evilsoup, nu fungerer det som en charme. Tak.
  • computedval=$(echo 'scale=10;var1-var2' | bc) fungerer ikke ' t, heller ikke computedval=$(echo 'scale=10;$var1-$var2' | bc)

Svar

Du kan også bruge $[ ... ] struktur. I dette tilfælde bruger vi indbygget mekanisme i Bash, hvilket er hurtigere og lidt mere praktisk at bruge. Da vi ved, at alt mellem $ [, og] behandles som et udtryk, behøver vi ikke gå forud for variablerne med $. Tilsvarende behøver vi ikke sikre * fra at 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` 

Bemærk \ før * (til multiplikation), hele udtrykket skal være inden for backquotes `.

Kommentarer

  • expr er ikke nødvendigt, og det ' er aldrig nødvendigt for at fange standardoutputtet af en kommando bare for at skrive det tilbage til standardoutput.

Svar

minimalistisk

total=0 ((total+=qty)) 

Svar

Baseret på rækkefølgen af input, du beder om fra brugeren det ser ud til, at du bruger omvendt polsk notation.

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

Du kan muligvis gøre det bedre bare at bruge dc (skrivebordslommeregner) direkte, da det er det, det er til.

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

E eksempelsession ved hjælp af 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 $ 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *