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 schlagen alle meine Versuche, die Zahlen zu addieren, fehl:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Laufen:
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 ob ich möglicherweise immer noch Zeichenfolgen erhalte, wenn ich versuche, „add“ zu addieren („2+2“ statt „4“).
Antwort1
Arithmetik in POSIX-Shellserfolgt mit $
und doppelten Klammern (( ))
:
echo "$(($num1+$num2))"
Sie können daraus Zuweisungen vornehmen. Beachten Sie auch, dass die $
Operatoren der darin enthaltenen Variablennamen (())
optional sind):
num1="$((num1+num2))"
Es gibt auch expr
:
expr $num1 + $num2
Beim Skripting $(())
ist dies vorzuziehen, da dadurch ein Fork/Execute für den expr
Befehl vermieden wird.
Antwort2
Die vorhandene Antwort ist reines Bash, also ist sie schneller als diese, kann aber nur Ganzzahlen verarbeiten. Wenn Sie Gleitkommazahlen verarbeiten müssen, müssen Sie das externe Programm verwenden bc
.
$ echo 'scale=4;3.1415+9.99' | bc
13.1315
Das scale=4
gibt an bc
, dass vier Dezimalstellen verwendet werden sollen. man bc
Weitere Informationen finden Sie unter.
Antwort3
Sie können auch Struktur verwenden $[ ... ]
. In diesem Fall verwenden wir den in Bash integrierten Mechanismus, der schneller und etwas bequemer zu verwenden ist. Da wir wissen, dass alles zwischen $[, und ] als Ausdruck behandelt wird, müssen wir den Variablen kein voranstellen $
. Ebenso müssen wir nicht verhindern, *
dass es wie ein Muster behandelt wird.
num1=2
num2=3
echo $[num1 + num2]
5
Antwort4
minimalistisch
total=0
((total+=qty))