Ich lerne Shell-Scripting für ein Diplom in IT, das ich gerade mache. Ich versuche, ein kleines Skript zu schreiben, das zwei Zahlen hinzufügt, wie in einem der Tutorials gezeigt.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Wenn ich es jedoch gebe Ausführungsberechtigung und Ausführen des Skripts, es gibt mir diesen Fehler.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Ich habe versucht, dies unter Ubuntu und Fedora auszuführen, aber es tritt der gleiche Fehler auf. Kann mir bitte jemand sagen, was mir hier fehlt?
Kommentare
- Verwandte Themen: unix.stackexchange.com/questions/40786/…
Antwort
Zuerst müssen Sie die Leerzeichen für die Zuweisung entfernen, z. B.
sum="expr $num1 + $num2"
dann müssen Sie "
in `
oder noch besser in :
sum=$(expr "$num1" + "$num2")
Anstatt expr
zu verwenden, können Sie auch die Berechnung durchführen ulation direkt in Ihrer Shell:
sum=$((num1 + num2))
Kommentare
- Wenn die Motivation für die Verwendung von
expr
anstelle von$((...))
ist der Wunsch, auf die klassische Bourne-Shell portierbar zu sein. Dann ist ' eine gute Idee um$(...)
ebenfalls zu vermeiden. - @AlanCurry Gibt es Shells, die
$()
nicht unterstützen? Soweit ich weiß, wird es von posix benötigt, z. Alle posix-kompatiblen Shells sollten$()
- @UlrichDangel unterstützen. Die ursprüngliche Bourne-Shell hatte ' kein
$(…)
, aber es ist ungefähr ausgestorben (vielleicht läuft irgendwo noch/bin/sh
unter Solaris). - Die C-Shell funktioniert nicht. t unterstützt
$(…)
–– oder zumindest nicht alle Versionen. - Was ist der Zweck von doppelten Anführungszeichen um die Variablen?
Antwort
Sie haben Backticks wahrscheinlich als einfache Anführungszeichen in der Zeile falsch gelesen:
sum = "expr $num1 + $num2"
Siehe Gregs Wiki zur Verwendung von $(...)
.
Dies funktioniert wie erwartet:
sum=$(expr "$num1" + "$num2")
Beachten Sie auch, dass das Gleichheitszeichen (die Variablenzuweisung) keine Lücken aufweist.
Antwort
expr
ist ein externes Programm, das von Bourne-Shell (d. h. Sch). Die Bourne-Shell hatte ursprünglich keinen Mechanismus, um eine einfache Arithmetik durchzuführen. Sie verwendet das externe Programm expr
mit Hilfe des Backticks.
Der Backtick ( `) wird tatsächlich als Befehlssubstitution bezeichnet. Die Befehlssubstitution ist der Mechanismus, mit dem die Shell einen bestimmten Befehlssatz ausführt und dann ihre Ausgabe in der ersetzt Ort der Befehle.
sum=`expr $num1 + $num2`
In bash (bourne again shell) es hat die folgende Systax, es wird kein externes Programm expr
verwendet.
sum=$((num1+num2))
wenn wir das externe Programm expr
verwenden möchten. Wir haben die folgende Systax:
sum=$(expr $num1 + $num2)