`Błąd składni:„ (”nieoczekiwany` podczas tworzenia tablicy)


37

Mam dwa serwery (Debian) Linux. Tworzę skrypt powłoki.

Na pierwszym tworzę tablicę w ten sposób:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

To działa dobrze. Ale kiedy uruchomię to na innym serwerze, otrzymuję:

Syntax error: "(" unexpected

O ile mogę stwierdzić, oba serwery są takie same. Czy ktoś może rzucić nieco światła na to, dlaczego to nie działa?

Jeśli wpiszę go bezpośrednio do terminala, to w porządku?


Wygląda na to, że kiedy uruchomię to jako

sh scriptname.sh

Pojawia się błąd, ale jeśli uruchomię go jako

./scriptname.sh

wydaje się być w porządku. Co za różnica?


Czy wkleiłeś skrypt między dwoma serwerami? spróbuj cat -v <script>sprawdzić, czy nie ma fałszywego char.
LilloX

2
shnie bashdziała i działa tak, jak sh scriptname.shjest źle
Eric Renouf

Odpowiedzi:


56

Gdy używasz ./scriptname.sh, wykonuje się /bin/bashtak jak w pierwszym wierszu z #!. Ale kiedy sh scriptname.shgo używasz , wykonuje się sh, nie bash.

shPowłoka ma składnię do tworzenia tablic, ale Bash ma składnię użyty.


OK, to ma teraz sens. Jak zapewne wiesz, jestem całkiem nowy w Linuksie (obecnie próbuję przekonwertować moje skrypty powłoki / bash Powershell). Odtąd będę się go posługiwał ./. na zdrowie
IGGt

To niekoniecznie, ale musi istnieć koordynacja między #!/bin/shi sh script.sh(lub #!/bin/bashi bash script.sh)
Konstantin Morenko

3
Język sh nie ma tablic ( a[index]=xlub a=(x y)). Niektóre interpretery sh obsługują tablice, tylko ksh88 (nie jest przeniesiony do Linux AFAIK) i niektóre starsze warianty pdksh będą obsługiwać a[index]=valuei nie a=(x y). Na Debianie shzwykle dashjest bez obsługi tablic ( a[index]=xnie działa).
Stéphane Chazelas

1
Od teraz mogę umrzeć w kawałku! :)
Paulo

0

Uruchomienie ./scriptname.shspowoduje odczytanie pierwszego wiersza pliku i zobaczenie, że musi on uruchomić ´ / bin / bash´ i przekazać resztę skryptu do interpretera, podczas gdy wykonanie sh scriptname.shprzekaże plik do standardowej powłoki użytkownika (np. Ash) i być może ten inny tłumacz nie obsługuje tablic, jak Bash.


1
shniekoniecznie jest „standardową powłoką użytkownika”, często jest wykonywalny (lub dowiązanie symboliczne) i shzostanie wywołany w celu przetworzenia skryptu. Będzie to prawdą, nawet jeśli domyślną powłoką logowania dla tego użytkownika jestbash
Eric Renouf,

W tej chwili nie byłem do końca pewien. Dziękuję za wyjaśnienie!
dave_alcarin

0

Z sh scriptname.sh, używasz go sh, niekoniecznie z bash. Spróbuj porównać sh --versionna obu komputerach. I / lub z dpkg -S $(which sh).


Nawet jeśli shjest to dowiązanie symboliczne bash, zachowuje się inaczej, gdy zostanie wywołane jakosh
Eric Renouf
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.