hoe kan ik twee getallen optellen (aftrekken, enz.) met bash?

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

  • Ik heb je titel aangepast omdat dit een goede algemene vraag is, en als je de context had beperkt, zou je je gerealiseerd hebben dat dit niets te maken heeft met 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
  • +1 Hallo goudlokje, ja dat werd me later duidelijk, maar ja ik totaal y ben het eens met uw redenering en ja, hoe specifieker en ' singular ' een vraag is, hoe beter. Ik verwelkom uw bewerking (en) 🙂 Dank u 🙂

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)) zonder case erbij te betrekken.
  • Daar ' is hier geen case bij betrokken.
  • Nee, maar je hebt letterlijk + gebruikt, dus je hebt de case buiten om de aftrekking afzonderlijk af te handelen.
  • @manatwork: Je moet n verwijder de case uit de OP ' s code met echo $(($num1$op$num2)) – dat zal werken , maar het gebruik van de case 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 van bc is dat het willekeurige precisie ondersteunt, terwijl shell-rekenkunde beperkt is tot de processor ' s double type. Merk op dat u ' t scale hier niet hoeft in te stellen. Voor toevoegingen wordt de parameter scale niet gebruikt. De schaal van 3.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 ' en computedval=$(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 $ 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *