Ich kann die Zahlen und die Bedienung lesen mit:
echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
Aber dann scheitern alle meine Versuche, die Zahlen hinzuzufügen:
case "$op" in
"+")
echo num1+num2;;
"-")
echo `num1-num2`;;
esac
Lauf:
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 vielleicht immer noch Zeichenketten bekommen, wenn ich add add ("2 + 2" statt "4") versuche.
case
oder etwas anderes als eine Zeile:,echo $num+$num
da dies das Problem genau reproduziert . Die Idee, den Kontext in Programmierfragen zu minimieren, wird hier erklärt: sscce.orgAntworten:
Arithmetik in POSIX-Shells erfolgt mit
$
und doppelten Klammern(( ))
:Daraus können Sie zuweisen (ohne
echo
):Es gibt auch
expr
:Bei der Skripterstellung
$(())
ist es vorzuziehen, da dadurch ein Fork / Execute für denexpr
Befehl vermieden wird .quelle
echo $(($num1$op$num2))
ohne mitzumachencase
.case
beteiligt.+
muss diecase
Außenseite für die Subtraktion separat behandelt werden.case
aus dem OP-Code entfernen mitecho $(($num1$op$num2))
- das wird funktionieren, aber die Verwendung voncase
ist robuster, da du Fehler mit einem Standard behandeln kannst*
.Die vorhandene Antwort ist pure bash, daher ist sie schneller als diese Antwort, kann jedoch nur Ganzzahlen verarbeiten. Wenn Sie mit Floats umgehen müssen, müssen Sie das externe Programm verwenden
bc
.Das
scale=4
weistbc
an, vier Dezimalstellen zu verwenden. Sieheman bc
für weitere Informationen.quelle
bash
nicht arithmetics Floating - Point unterstützt mit$((...))
, viele Muscheln (ksh93
,zsh
,yash
zumindest) tun. Der Vorteil vonbc
ist, dass es eine beliebige Genauigkeit unterstützt, während die Shell-Arithmetik auf den Prozessortyp beschränkt istdouble
. Beachten Sie, dass Sie hier keine Einstellungenscale
vornehmen müssen. Für Zusätze wird derscale
Parameter nicht verwendet. Die Skala von3.1415+9.99
wird von der der Operanden abgeleitet (hier 4).450
dezimal in einer Variablen gespeichert ist$mynumber
? Zum Beispiel450-$mynumber
.echo "450-$mynumber" | bc
sollte es tun. Wenn Sie möchten, dass eine Variable erweitert wird, müssen Sie doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden.computedval=$(echo 'scale=10;var1-var2' | bc)
funktioniert nicht und auch nichtcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Beachten Sie, dass
\
vor*
(zur Multiplikation) der gesamte Ausdruck in Anführungszeichen stehen muss.quelle
expr
ist nicht erforderlich, und es ist niemals erforderlich, die Standardausgabe eines Befehls zu erfassen, nur um sie in die Standardausgabe zurückzuschreiben.minimalistisch
quelle
Sie können auch
$[ ... ]
Struktur verwenden. In diesem Fall verwenden wir den in Bash integrierten Mechanismus, der schneller und etwas komfortabler zu bedienen ist. Da wir wissen, dass alles zwischen $ [und] als Ausdruck behandelt wird, müssen wir den Variablen keinen vorangestellten Wert voranstellen$
. Ebenso müssen wir uns nicht davor*
schützen, es wie ein Muster zu behandeln.quelle
Basierend auf der Reihenfolge der Eingaben, die Sie vom Benutzer anfordern, scheint es, dass Sie die umgekehrte polnische Notation verwenden.
Sie können es besser machen, wenn Sie nur
dc
(Tischrechner) direkt verwenden, da dies der Zweck ist.Beispielsitzung mit
dc
:Oder nicht interaktiv:
quelle