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))
ohnecase
. - Dort ' s no
case
ist hier beteiligt. - Nein, aber Sie haben das Literal
+
verwendet, benötigen also dascase
außerhalb, um die Subtraktion separat zu behandeln. - @manatwork: Sie messen n Entfernen Sie den
case
aus dem Code des OP ' mitecho $(($num1$op$num2))
– das wird funktionieren Die Verwendung voncase
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 vonbc
besteht darin, dass es eine beliebige Genauigkeit unterstützt, während die Shell-Arithmetik auf den Prozessor ' sdouble
Typ. Beachten Sie, dass Sie ' hier nichtscale
einstellen müssen. Für Ergänzungen wird der Parameterscale
nicht verwendet. Die Skala von3.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 ' undcomputedval=$(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 `.
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 $