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

IGGt
źródło
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.

Konstantin Morenko
źródło
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.

dave_alcarin
źródło
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).

joepd
źródło
Nawet jeśli shjest to dowiązanie symboliczne bash, zachowuje się inaczej, gdy zostanie wywołane jakosh
Eric Renouf