Dodanie dwóch liczb za pomocą wyraż

13

Uczę się skryptowania powłoki w celu uzyskania dyplomu z informatyki. Próbuję napisać mały skrypt, który dodaje dwie liczby, jak pokazano w jednym z samouczków, które otrzymaliśmy.

echo "Enter two numbers"
read num1 num2
sum = 'expr $num1 + $num2'
echo "The sum is = $sum"

Jednak gdy udzielam mu pozwolenia na wykonanie i uruchamiam skrypt, pojawia się ten błąd.

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

wprowadź opis zdjęcia tutaj

Próbowałem uruchomić to zarówno na Ubuntu, jak i Fedorze, ale występuje ten sam błąd. Czy ktoś może mi powiedzieć, czego tu brakuje?

Isuru
źródło

Odpowiedzi:

39

Najpierw musisz pozbyć się miejsca na zadanie, np

sum='expr $num1 + $num2'

musisz zmienić 'na a `nawet lepiej, aby $():

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

zamiast używać exprmożesz wykonać obliczenia bezpośrednio w powłoce:

sum=$((num1 + num2))
Ulrich Dangel
źródło
3
Jeśli motywacją do używania exprzamiast $((...))chęci jest przenośność do klasycznej skorupy Bourne'a, dobrym pomysłem jest również tego unikać $(...).
Alan Curry,
2
@AlanCurry czy są jakieś powłoki, które nie obsługują $()? O ile wiem, jest to wymagane przez posix, np. Wszystkie powłoki kompatybilne z posix powinny obsługiwać$()
Ulrich Dangel
1
@UlrichDangel Oryginalna powłoka Bourne'a nie miała $(…), ale już prawie wymarła (może ktoś gdzieś nadal działa /bin/shna Solarisie).
Gilles 'SO - przestań być zły'
Powłoka C nie obsługuje $(…)–– a przynajmniej nie wszystkich wersji.
Scott
Jaki jest cel podwójnego cudzysłowu wokół zmiennych?
kojow7
9

Prawdopodobnie źle odczytałeś znaki wsteczne jako pojedyncze cudzysłowy w wierszu:

sum = 'expr $num1 + $num2'

Zobacz Greg's Wiki na temat używania $(...)zamiast tego.

Działa to zgodnie z oczekiwaniami:

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

Zauważ również, że nie ma żadnych luk wokół znaku równości (przypisanie zmiennej).

jasonwryan
źródło
1

exprto zewnętrzny program używany przez powłokę Bourne'a (tj. sh). Pocisk Bourne'a początkowo nie miał żadnego mechanizmu do wykonywania prostej arytmetyki. Korzysta z exprzewnętrznego programu za pomocą backticka.

Strzałka wsteczna ( ` ) jest w rzeczywistości nazywana substytucją polecenia. Podstawianie poleceń jest mechanizmem, za pomocą którego powłoka wykonuje dany zestaw poleceń, a następnie zastępuje ich dane wyjściowe zamiast poleceń.

sum=`expr $num1 + $num2`

W bash (bourne again shell) ma następujący systax, nie będzie używał programu zewnętrznego expr.

sum=$((num1+num2))

jeśli chcemy skorzystać z programu zewnętrznego expr. mamy następujący systax:

sum=$(expr $num1 + $num2)
Premraj
źródło
0

Jeśli używasz bash, możesz po prostu zrobić coś takiego:

sum=$((num1+num2))
Hopping Bunny
źródło
-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
źródło
dodaj także opis kodu i jak pomoże rozwiązać pytanie?
Tejas
-1

echo "enter first no :"; read a
echo "enter second no :"; read b
echo "sum = `expr $a + $b`"
pandu raju
źródło
-2

Możesz użyć jednego przycisku wstecz ( `klawisz)

prashant sahare
źródło
1
Jest to strzał wsteczny i zaleca się stosowanie $( ... )zamiast niego w powłokach. Poza tym problem polega na tym, że OP używa spacji tam, gdzie nie powinny.
vonbrand
-2
echo a 
read a
echo b
read b
c=`expr $a + $b`
echo $c
prasanna
źródło
-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
źródło
3
To nie odpowiada na pytanie. Pomocne byłoby wyjaśnienie.
Bernhard