Uczę się pisania skryptów Shell do dyplomu z IT, który obecnie robię. Próbuję napisać mały skrypt, który dodaje dwie liczby, jak pokazano w jednym z otrzymanych tutoriali.

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

Jednak gdy dam mu zezwolenie na wykonanie i uruchomienie skryptu powoduje ten błąd.

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

tutaj wprowadź opis obrazu

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

Komentarze

Odpowiedź

Najpierw musisz pozbyć się spacji dla zadania, np.

sum="expr $num1 + $num2" 

wtedy musisz zmienić " na ` lub nawet lepiej na $():

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

zamiast używać expr możesz także wykonać obliczenia ulacja bezpośrednio w Twojej powłoce:

sum=$((num1 + num2)) 

Komentarze

  • Jeśli motywacja do używania expr zamiast $((...)) to chęć przeniesienia się na klasyczną powłokę Bournea, a więc ' to dobry pomysł aby uniknąć $(...) również.
  • @AlanCurry czy są jakieś powłoki, które nie obsługują $()? O ile wiem, posix tego wymaga np. wszystkie powłoki kompatybilne z Posix powinny obsługiwać $()
  • @UlrichDangel Oryginalna powłoka Bournea nie ' nie ma $(…), ale prawie wygasł (może ktoś gdzieś nadal działa /bin/sh w systemie Solaris).
  • Powłoka C nie działa. t obsługuje $(…) –– lub przynajmniej nie wszystkie wersje.
  • Jaki jest cel umieszczania zmiennych w cudzysłowach?

Odpowiedź

Prawdopodobnie błędnie odczytałeś apostrofy jako pojedyncze cudzysłowy w wierszu:

sum = "expr $num1 + $num2"

Zobacz Wiki Grega na temat korzystania z $(...).

To działa zgodnie z oczekiwaniami:

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

Zwróć również uwagę, że nie ma przerw wokół znaku równości (przypisanie zmiennej).

Odpowiedź

expr to zewnętrzny program używany przez powłoka Bournea (tj. sh). Powłoka Bournea pierwotnie nie miała żadnego mechanizmu do wykonywania prostych działań arytmetycznych. Używa zewnętrznego programu expr z pomocą backticka.

Lewy przycisk ( `) jest w rzeczywistości nazywane zastępowaniem poleceń. Podstawianie poleceń to mechanizm, za pomocą którego powłoka wykonuje dany zestaw poleceń, a następnie podstawia ich wyjście w miejsce poleceń.

sum=`expr $num1 + $num2` 

In bash (znowu powłoka bourne) ma następujący systax, nie „nie użyje programu zewnętrznego expr.

sum=$((num1+num2)) 

jeśli chcemy użyć programu zewnętrznego expr. mamy następujący systax:

sum=$(expr $num1 + $num2) 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *