Addieren von zwei Zahlen mit expr

13

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 ihm jedoch die Ausführungsberechtigung erteile und das Skript ausführe, erhalte ich diesen Fehler.

sum: =. No such file or directory.
sum: expr $num1 + $num2: No such file or directory

Bildbeschreibung hier eingeben

Ich habe versucht, dies auf Ubuntu und Fedora auszuführen, aber derselbe Fehler tritt auf. Kann mir bitte jemand sagen, was ich hier vermisse?

Isuru
quelle

Antworten:

39

Zuerst müssen Sie die Leerzeichen für die Zuordnung entfernen, z

sum='expr $num1 + $num2'

dann musst du 'auf a `oder noch besser auf $():

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

Anstatt zu verwenden expr, können Sie die Berechnung auch direkt in Ihrer Shell durchführen:

sum=$((num1 + num2))
Ulrich Dangel
quelle
3
Wenn die Motivation für die Verwendung von expranstelle des $((...))Wunsches ist, auf die klassische Bourne-Shell portierbar zu sein, ist es eine gute Idee, dies ebenfalls zu vermeiden $(...).
Alan Curry
2
@AlanCurry Gibt es Shells, die nicht unterstützt werden $()? So weit ich weiß, wird es von posix benötigt, zB sollten alle posix-kompatiblen Shells unterstützt werden$()
Ulrich Dangel
1
@UlrichDangel Die ursprüngliche Bourne-Shell hatte keine $(…), aber sie ist fast ausgestorben (vielleicht läuft irgendwo noch jemand unter /bin/shSolaris).
Gilles 'SO- hör auf böse zu sein'
Die C-Shell unterstützt nicht $(…)- oder zumindest nicht alle Versionen.
Scott
Was ist der Zweck von doppelten Anführungszeichen um die Variablen?
Kojow7
9

Sie haben wahrscheinlich Backticks als einfache Anführungszeichen in der Zeile falsch interpretiert:

sum = 'expr $num1 + $num2'

Siehe stattdessen Gregs Wiki zur Verwendung $(...).

Das funktioniert wie erwartet:

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

Beachten Sie auch, dass es keine Lücken um das Gleichheitszeichen (die Variablenzuordnung) gibt.

jasonwryan
quelle
1

exprist ein externes Programm, das von der Bourne-Shell verwendet wird (dh sh). Die Bourne-Shell verfügte ursprünglich nicht über einen Mechanismus, um einfache Arithmetik durchzuführen. Es verwendet exprexternes Programm mit Hilfe von Backtick.

Das Backtick ( ` ) wird eigentlich als Befehlsersetzung bezeichnet. Die Befehlsersetzung ist der Mechanismus, mit dem die Shell einen bestimmten Satz von Befehlen ausführt und dann deren Ausgabe anstelle der Befehle ersetzt.

sum=`expr $num1 + $num2`

In bash (bourne again shell) hat es den folgenden Systax, es wird kein externes Programm verwendet expr.

sum=$((num1+num2))

wenn wir das externe Programm verwenden wollen expr. wir haben folgenden systax:

sum=$(expr $num1 + $num2)
Premraj
quelle
0

Wenn Sie bash verwenden, können Sie einfach Folgendes tun:

sum=$((num1+num2))
Hopfender Hase
quelle
-1
#!/bin/bash
function add()
{
sum=`expr $a + $b`
echo "Sum is :$sum";
}

echo "Enter the value of a";
read a
echo "Enter the valure of b";
read b
add
Imtiyaz
quelle
Fügen Sie auch eine Beschreibung des Codes hinzu, und wie kann die Frage gelöst werden?
Tejas
-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"
Pandu Raju
quelle
-2

Sie können ein einzelnes Backtick (den `Schlüssel) verwenden.

Prashant Sahare
quelle
1
Es ist ein Backtick, und es wird empfohlen, $( ... )stattdessen in den Muscheln zu verwenden. Außerdem ist das Problem, dass OP Räume verwendet, in denen sie nicht sollten.
vonbrand
-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c
Prasanna
quelle
-3
echo "addition of two number"

echo "enter a number"
read a
echo "enter a number"
read b

c=`expr $a + $b`

echo $c
kishan
quelle
3
Dies beantwortet die Frage nicht. Eine Erklärung würde helfen.
Bernhard