Wie kann ich mit bash zwei Zahlen addieren (subtrahieren usw.)?

Ich kann die Zahlen und Operationen einlesen mit:

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

aber dann alle Meine Versuche, die Zahlen hinzuzufügen, schlagen fehl:

case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac 

Ausführen:

First number please 1 Second mumber please 2 Operation? + 

Ausgabe:

num1+num2 

… oder …

echo $num1+$num2;; # results in: 1+2 

… oder. ..

echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found 

Scheint, als würde ich immer noch Zeichenfolgen erhalten, wenn ich versuche, add hinzuzufügen („2 + 2“ anstelle von „4“).

Kommentare

  • Ich habe Ihren Titel bearbeitet, da dies eine gute allgemeine Frage ist. Wenn Sie den Kontext eingegrenzt hätten, hätten Sie festgestellt, dass dies nichts damit zu tun hat case oder irgendetwas anderes als eine Zeile: echo $num+$num, da dies das Problem genau reproduziert . Die Idee mit Minimierung Der Kontext bei Programmierfragen wird hier erklärt: sscce.org
  • +1 Hallo Goldlöckchen, ja, das wurde mir später klar, aber ja, ich total y stimme Ihrer Argumentation zu und ja, je spezifischer und ' Singular ' eine Frage ist, desto besser. Ich begrüße Ihre Bearbeitung (en) 🙂 Vielen Dank 🙂

Antwort

Arithmetik in POSIX-Shells erfolgt mit $ und doppelten Klammern (( )):

echo "$(($num1+$num2))" 

Sie können daraus zuweisen (ohne echo):

num1="$(($num1+$num2))" 

Es gibt auch expr:

expr $num1 + $num2 

In Skripten $(()) ist vorzuziehen, da es eine Verzweigung / Ausführung für den Befehl expr vermeidet.

Kommentare

  • Oder sogar direkt echo $(($num1$op$num2)) ohne case.
  • Dort ' s no case ist hier beteiligt.
  • Nein, aber Sie haben das Literal + verwendet, benötigen also das case außerhalb, um die Subtraktion separat zu behandeln.
  • @manatwork: Sie messen n Entfernen Sie den case aus dem Code des OP ' mit echo $(($num1$op$num2)) – das wird funktionieren Die Verwendung von case ist jedoch robuster, da Sie Fehler mit einem Standardwert * behandeln können.
  • +1 bis ihr beide. Ich habe case verwendet (möglicherweise nicht am Anfang gezeigt), aber wie Sie beide festgestellt haben, war das Problem nicht ' t über den Fall.

Antwort

Die vorhandene Antwort ist reine Bash, daher ist sie schneller als diese, kann jedoch nur Ganzzahlen verarbeiten. Wenn Sie Floats verarbeiten müssen, müssen Sie das externe Programm bc verwenden.

$ echo "scale=4;3.1415+9.99" | bc 13.1315 

Die scale=4 weist bc an, vier Dezimalstellen zu verwenden. Weitere Informationen finden Sie unter man bc.

Kommentare

  • Beachten Sie, dass bash ' unterstützt keine Gleitkomma-Arithmetik mit $((...)), vielen Shells (ksh93, zsh, yash mindestens). Der Vorteil von bc besteht darin, dass es eine beliebige Genauigkeit unterstützt, während die Shell-Arithmetik auf den Prozessor ' s double Typ. Beachten Sie, dass Sie ' hier nicht scale einstellen müssen. Für Ergänzungen wird der Parameter scale nicht verwendet. Die Skala von 3.1415+9.99 wird von der der Operanden abgeleitet (hier 4).
  • Wie wird berechnet, wenn ein Wert und die andere ist dezimal in einer Variablen $mynumber gespeichert? Beispiel: 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc sollte dies tun. Wenn Sie möchten, dass eine Variable erweitert wird, müssen Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden.
  • @evilsoup, jetzt funktioniert es wie ein Zauber. Vielen Dank.
  • computedval=$(echo 'scale=10;var1-var2' | bc) funktioniert nicht ' und computedval=$(echo 'scale=10;$var1-$var2' | bc)

Antwort

Sie können auch die Struktur $[ ... ] verwenden. In diesem Fall verwenden wir die in Bash integrierte Mechanik, die schneller und bequemer zu bedienen ist. Da wir wissen, dass alles zwischen $ [und] als Ausdruck behandelt wird, müssen wir den Variablen nicht $ voranstellen. Ebenso müssen wir * von der Behandlung wie ein Muster.

num1=2 num2=3 echo $[num1 + num2] 5 

Antwort

echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b` 

Beachten Sie die \ vor der * (zur Multiplikation). Der gesamte Ausdruck muss innerhalb der Backquotes `.

Kommentare

  • expr ist nicht erforderlich und ' ist nie Dies ist erforderlich, um die Standardausgabe eines Befehls zu erfassen und nur in die Standardausgabe zurückzuschreiben.

Antwort

minimalistisch

total=0 ((total+=qty)) 

Antwort

Basierend auf der Reihenfolge der Eingaben, die Sie vom Benutzer anfordern Anscheinend verwenden Sie die umgekehrte polnische Notation.

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

Es ist möglicherweise besser, dc (Tischrechner) direkt zu verwenden, da dies der Fall ist.

DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic. 

E. Beispielsitzung mit dc:

$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $ 

Oder nicht interaktiv:

$ dc -e "1 2 + p" 3 $ 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.