2012-06-14 14 views
18

Piszę ten prosty skrypt bash w następujący sposób.Bash array: Nieoczekiwany błąd składniowy

#!/bin/bash 

array=(/home/abc/Downloads/something.bat /home/abc/Downloads/smb.conf) 
echo ${array[@]} 

Oczekiwalem, że wydrukuje wszystkie nazwy plików w tablicy. Ale pojawia się ten błąd zamiast:

test.sh: 3: Syntax error: "(" unexpected 

Jeśli zmienię deklarację tablicy do

array = {/home/abc/Downloads/something.bat /home/abc/Downloads/smb.conf} 

ten błąd nie zniknie, ale ciągle mam nowe błędy

test.sh: 3: array: not found 
test.sh: 4: Bad substitution 

Jak mogę rozwiązać ten przypadek? To jest mój pierwszy raz w programowaniu powłoki, więc nie jestem w stanie samodzielnie rozwiązać problemów.

ZDECYDOWANE:

byłem wykonywanie go jako sh test.sh ale zapomniałem musiałem wykonać go jako bash test.sh

+1

To nie jest tablica asocjacyjna. Jest to normalna, numerycznie indeksowana tablica. –

+0

@DennisWilliamson Oh Ok. Będę go edytować – user1357576

+2

@ user1357576: Opublikuj rozwiązanie jako odpowiedź i zaznacz je jako zaakceptowane, nie edytuj go na pytanie. Ponadto nie edytuj tytułu, aby go rozwiązać, witryna oznaczy pytanie jako rozwiązane po zaakceptowaniu odpowiedzi. – Daenyth

Odpowiedz

1

przypisania zmiennej nie może mieć miejsca wokół znaku = :

array=(/a/b/ /c/d) 
    ^--no spaces 

jesteś pewien?

[email protected]:~$ array =(a b)  
bash: syntax error near unexpected token `(' 
[email protected]:~$ array= (a b) 
bash: syntax error near unexpected token `(' 
m[email protected]:~$ array = (a b) 
bash: syntax error near unexpected token `(' 
[email protected]:~$ array=(a b) 
[email protected]:~$ echo ${array[1]} 
b 
+0

Brak szczęścia. Usunąłem przestrzeń nadal daje mi błąd składni – user1357576

+0

co ciekawe, gdy wykonuję go bezpośrednio na terminalu, to działa.Ale kiedy używam tego samego w pliku, nie ma! – user1357576

+0

@ user1357576: działa dobrze tutaj, kiedy umieściłem powyższy plik w pliku. Oczywiście linie błędów składni zabijają skrypt, ale jeśli to tylko końcowe zadanie bez przestrzeni, działa dobrze. –

0

Wskaźnik: Spacje są ważne przy przypisaniu zmiennych w BASH. Nie używaj ich przed przed lub po znaku równości.

+0

Rozumiem, że> Wykonałem te same polecenia bezpośrednio na terminalu i zadziałało. ALE te same polecenia, które umieściłem w test.sh i wykonaj, rzucają błąd. Czy wiesz, dlaczego? – user1357576

+0

@ user1357576 Z powyższego komentarza wynika, że ​​nauczyłeś się różnicy między 'sh' i' bash'. 'sh' nie ma gwarancji, że będzie' bash' w niektórych środowiskach. W rzeczywistości 'sh' jest często związany z czystymi powłokami POSIX, takimi jak' dash'. –

0

Czy używasz edytora DOS do tworzenia skryptu?

Powłoki itp. Bash, nie lubię par CRLF, tylko LF (lub \r\n znaków VS tylko zwykły \n char).

Put skryptu thru tego testu

cat -vet myScript.sh 

widzisz znaki '^ M' na końcu linii? Jeśli tak, to jest plik dos.

Sprawdź, czy twój system dos2unix następnie używać go jak

dos2unix myScript.sh 

Również, jak wiele ludzie pisali na ten temat, proszę edytować swoje oryginalne pytanie, aby wyeliminować przestrzenie wokół = znaki na zadaniach do array.

Mam nadzieję, że to pomoże.

Powiązane problemy