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))zondercaseerbij te betrekken. - Daar ' is hier geen
casebij betrokken. - Nee, maar je hebt letterlijk
+gebruikt, dus je hebt decasebuiten om de aftrekking afzonderlijk af te handelen. - @manatwork: Je moet n verwijder de
caseuit de OP ' s code metecho $(($num1$op$num2))– dat zal werken , maar het gebruik van decaseis 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
bashondersteunt geen ' t ondersteuning van drijvende-kommaberekeningen met$((...)), veel shells (ksh93,zsh,yashtenminste) doen. Het voordeel vanbcis dat het willekeurige precisie ondersteunt, terwijl shell-rekenkunde beperkt is tot de processor ' sdoubletype. Merk op dat u ' tscalehier niet hoeft in te stellen. Voor toevoegingen wordt de parameterscaleniet gebruikt. De schaal van3.1415+9.99wordt 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" | bczou 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
-
expris 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 $
caseof 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