2013-08-07 15 views
6

Gdzie jest błąd na linii czwartej?Dlaczego otrzymuję niespodziewany błąd operatora w teście równości ciągi bash?

if [ $bn == README ]; then 

który ja wciąż dostać jeśli piszę to jako

if [ $bn == README ] 
then 

lub

if [ "$bn" == "README" ]; then 

Kontekst:

for fi in /etc/uwsgi/apps-available/* 
do 
     bn=`basename $fi .ini` 
     if [ $bn == "README" ] 
     then 
       echo "~ ***#*** ~" 
     else 
       echo "## Shortend for convience ##" 
     fi 
done 
+1

Z 'if [$ bn ==" README "]' powinno działać. – fedorqui

+0

Próbowałem dokonać tej zmiany w oryginalnym skrypcie i nadal dostaję błąd. Zrobiłem wiele testów. Z cytatami na jednej lub obu stronach w prostych testach, jeśli ustawię rme = README, to na przykład [$ rme == README] && echo "equal"; wyjście jest równe. Nie ma znaczenia, gdzie są spacje - z [oczywiście, ale także jeśli umieścisz spacje po jednej stronie == muszą być po drugiej. (Znam bash.) Redagowałem półksiężyce na wszelki wypadek, gdybym miał zbłąkane i to nie naprawiło ani nie zmieniło linii błędu. –

+0

Zaktualizuj pytanie, podając kod, który powoduje nowe błędy. Dotknąłem pliku README w katalogu testowym, a twój kod zadziałał na mnie z moją poprzednią sugestią 'if [$ bn ==" README "]'. – fedorqui

Odpowiedz

8

Nie można używać == do pojedynczego uchwytu porównania ([]). Zamiast tego użyj singla =. Musisz także podać zmienne, aby zapobiec ekspansji.

if [ "$bn" = README ]; then 

Jeśli używasz [[]], które mogą mieć zastosowanie i nie trzeba zacytować pierwszy argument:

if [[ $bn == README ]]; then 
+0

Xmm ... Na 'bash 3.2.25'' == 'działa ze składnią" [...] ". Być może jest to specyficzna dla wersji. – user000001

+2

@ user000001 On _bash_, yes, '==' działa, ale jest rozszerzeniem - standard POSIX nie wymaga go do pracy, więc piszesz kod, który nie jest przenośny bez żadnego powodu. –

+0

Dobra wskazówka na temat przenośności! I ... to nie rozwiązało dokładnie tego w zamierzony sposób. Ale rozmowa uświadomiła mi, że wstydzę się mówić ... nie używając basha - przez pomyłkę. Myślałem, że jestem, ale NIE. Używałem domyślnie sh.Zapomniałem linii #!/Bin/bash i nie używałem skryptu bash, aby go uruchomić. dodanie #!/bin/bash rozwiązało problem. –

3

Dodaj poniższe linie do góry skryptu:

#! /bin/bash 

W wersji bash, ==is the same jako = w przypadku użycia w pojedynczych nawiasach. Nie jest to jednak przenośne. Powinieneś więc jawnie powiedzieć powłoce, aby użyło basha jako interpretera skryptu, umieszczając #! /bin/bash u góry skryptu.

Możesz też porównywać łańcuchy, używając =. Należy zauważyć, że operator == zachowuje się inaczej, gdy jest używany wewnątrz podwójnych nawiasów niż w przypadku pojedynczego nawiasu (patrz link).

Powiązane problemy