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
case
involveret her. - Nej, men du brugte bogstaveligt
+
, så du skal brugecase
udenfor for at håndtere subtraktionen separat. - @manatwork: Du betyder n fjern
case
fra OP ' s kode medecho $(($num1$op$num2))
– det fungerer , men at brugecase
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 vedbc
er, at den understøtter vilkårlig præcision, mens shell-aritmetik er begrænset til processoren ' sdouble
type. Bemærk, at du ikke ' behøver at indstillescale
her. Til tilføjelser anvendes parameterenscale
. Skalaen for3.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 skal450-$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 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
-
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 $
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