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?


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

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


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)


-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

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

-2

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


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


-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
To nie odpowiada na pytanie. Pomocne byłoby wyjaśnienie.
Bernhard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.