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
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 involverecase. - Der ' s ingen
caseinvolveret her. - Nej, men du brugte bogstaveligt
+, så du skal brugecaseudenfor for at håndtere subtraktionen separat. - @manatwork: Du betyder n fjern
casefra OP ' s kode medecho $(($num1$op$num2))– det fungerer , men at brugecaseer 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
bashunderstøtter ikke ' t understøtter flydende aritmetik med$((...)), mange skaller (ksh93,zsh,yashi det mindste) gør. Fordelen vedbcer, at den understøtter vilkårlig præcision, mens shell-aritmetik er begrænset til processoren ' sdoubletype. Bemærk, at du ikke ' behøver at indstillescaleher. Til tilføjelser anvendes parameterenscale. Skalaen for3.1415+9.99stammer fra operandernes (her 4). - Sådan gør du matematikken, hvis en værdi er
450og den anden er decimal gemt på en variabel$mynumber? For eksempel skal450-$mynumber. - @sigur
echo "450-$mynumber" | bcgø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 ikkecomputedval=$(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
-
exprer 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 $
caseeller andet end en linje:echo $num+$num, da gengiver problemet nøjagtigt . Ideen med minimering kontekst i programmeringsspørgsmål forklares her: sscce.org