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
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?
shell-script
Isuru
źródło
źródło
Odpowiedzi:
Najpierw musisz pozbyć się miejsca na zadanie, np
musisz zmienić
'
na a`
nawet lepiej, aby$()
:zamiast używać
expr
możesz wykonać obliczenia bezpośrednio w powłoce:źródło
expr
zamiast$((...))
chęci jest przenośność do klasycznej skorupy Bourne'a, dobrym pomysłem jest również tego unikać$(...)
.$()
? O ile wiem, jest to wymagane przez posix, np. Wszystkie powłoki kompatybilne z posix powinny obsługiwać$()
$(…)
, ale już prawie wymarła (może ktoś gdzieś nadal działa/bin/sh
na Solarisie).$(…)
–– a przynajmniej nie wszystkich wersji.Prawdopodobnie źle odczytałeś znaki wsteczne jako pojedyncze cudzysłowy w wierszu:
Zobacz Greg's Wiki na temat używania
$(...)
zamiast tego.Działa to zgodnie z oczekiwaniami:
Zauważ również, że nie ma żadnych luk wokół znaku równości (przypisanie zmiennej).
źródło
expr
to 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 zexpr
zewnę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ń.
W bash (bourne again shell) ma następujący systax, nie będzie używał programu zewnętrznego
expr
.jeśli chcemy skorzystać z programu zewnętrznego
expr
. mamy następujący systax:źródło
Jeśli używasz bash, możesz po prostu zrobić coś takiego:
źródło
źródło
źródło
Możesz użyć jednego przycisku wstecz ( `klawisz)
źródło
$( ... )
zamiast niego w powłokach. Poza tym problem polega na tym, że OP używa spacji tam, gdzie nie powinny.źródło
źródło