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?


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))

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.


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)


-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

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`"

-2

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


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


-3
echo "addition of two number"

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

c=`expr $a + $b`

echo $c

3
Dies beantwortet die Frage nicht. Eine Erklärung würde helfen.
Bernhard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.