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
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 å involverecase
. - Der ' s ingen
case
involvert her. - Nei, men du brukte bokstavelig
+
, så trengercase
utenfor for å håndtere subtraksjonen separat. - @manatwork: You mea n eliminere
case
fra OP ' s kode medecho $(($num1$op$num2))
– som vil fungere , men å brukecase
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 medbc
er at den støtter vilkårlig presisjon mens skallaritmetikk er begrenset til prosessoren ' sdouble
type. Merk at du ikke ' ikke trenger å angiscale
her. For tillegg brukes ikke parameterenscale
. Skalaen til3.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 skal450-$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 ikkecomputedval=$(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 $
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