Ik kan de cijfers en bewerking lezen met:
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
maar dan allemaal mijn pogingen om de nummers toe te voegen mislukken:
case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac
Uitvoeren:
First number please 1 Second mumber please 2 Operation? +
Output:
num1+num2
… of …
echo $num1+$num2;; # results in: 1+2
… of. ..
echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found
Het lijkt erop dat ik “nog steeds strings krijg als ik probeer add add (” 2 + 2 “in plaats van” 4 “) toe te voegen.
Reacties
Antwoord
Rekenen in POSIX-shells wordt gedaan met $
en dubbele haakjes (( ))
:
echo "$(($num1+$num2))"
U kunt daaruit toewijzen (sans echo
):
num1="$(($num1+$num2))"
Er is ook expr
:
expr $num1 + $num2
In scripting $(())
verdient de voorkeur omdat het een fork / execute voor het expr
commando vermijdt.
Reacties
- Of zelfs rechtstreeks
echo $(($num1$op$num2))
zondercase
erbij te betrekken. - Daar ' is hier geen
case
bij betrokken. - Nee, maar je hebt letterlijk
+
gebruikt, dus je hebt decase
buiten om de aftrekking afzonderlijk af te handelen. - @manatwork: Je moet n verwijder de
case
uit de OP ' s code metecho $(($num1$op$num2))
– dat zal werken , maar het gebruik van decase
is robuuster omdat u fouten kunt afhandelen met een standaard*
. - +1 aan jullie beiden. Ik gebruikte case (had het in het begin misschien niet getoond) maar zoals jullie beiden realiseerden was het probleem niet ' t over de case.
Antwoord
Het bestaande antwoord is pure bash, dus het zal sneller zijn dan dit, maar het kan alleen gehele getallen verwerken. Als je floats moet afhandelen, moet je het externe programma bc
gebruiken.
$ echo "scale=4;3.1415+9.99" | bc 13.1315
Het scale=4
vertelt bc
om vier decimalen te gebruiken. Zie man bc
voor meer informatie.
Reacties
- Merk op dat terwijl
bash
ondersteunt geen ' t ondersteuning van drijvende-kommaberekeningen met$((...))
, veel shells (ksh93
,zsh
,yash
tenminste) doen. Het voordeel vanbc
is dat het willekeurige precisie ondersteunt, terwijl shell-rekenkunde beperkt is tot de processor ' sdouble
type. Merk op dat u ' tscale
hier niet hoeft in te stellen. Voor toevoegingen wordt de parameterscale
niet gebruikt. De schaal van3.1415+9.99
wordt afgeleid van die van de operanden (hier 4). - Hoe de berekening uit te voeren als een waarde en de andere is decimaal opgeslagen op een variabele
$mynumber
? Bijvoorbeeld:450-$mynumber
. - @sigur
echo "450-$mynumber" | bc
zou het moeten doen. Als je een variabele wilt uitbreiden, moet je dubbele aanhalingstekens gebruiken in plaats van enkele aanhalingstekens. - @evilsoup, nu werkt het als een zonnetje. Bedankt.
-
computedval=$(echo 'scale=10;var1-var2' | bc)
werkt niet ' encomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Answer
Je kunt ook de $[ ... ]
structuur gebruiken. In dit geval gebruiken we een ingebouwde mechanizm in Bash, die sneller en wat handiger in gebruik is. Aangezien we weten dat alles tussen $ [, en] wordt behandeld als een uitdrukking, hoeven we de variabelen niet vooraf te laten gaan met $
. Evenzo hoeven we *
door het als een patroon te behandelen.
num1=2 num2=3 echo $[num1 + num2] 5
Antwoord
echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b`
Let op de \
voor de *
(voor vermenigvuldiging), de hele uitdrukking moet tussen de aanhalingstekens staan `.
Reacties
-
expr
is niet nodig, en het ' is nooit nodig om de standaarduitvoer van een commando vast te leggen alleen om het terug te schrijven naar de standaarduitvoer.
Answer
minimalistisch
total=0 ((total+=qty))
Antwoord
Gebaseerd op de volgorde van invoer die u van de gebruiker vraagt , het lijkt erop dat u omgekeerde Poolse notatie gebruikt.
echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op
Het is misschien beter om dc
(bureaucalculator) rechtstreeks te gebruiken, aangezien het daarvoor is.
DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic.
E voorbeeldsessie met dc
:
$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $
Of, niet-interactief:
$ dc -e "1 2 + p" 3 $
case
of iets anders dan één regel:echo $num+$num
, aangezien het probleem exact zal reproduceren . Het idee met het minimaliseren context in programmeervragen wordt hier uitgelegd: sscce.org