Jestem nowym użytkownikiem skryptów bash i staram się uczyć w systemie Windows, więc pobrałem cygwin. W systemie Windows 10 cygwin v2.5.1
Upewniłem się, że zainstalowałem pakiet bash (zrobiłem), więc zacząłem przeglądać tutoriale, ale kiedy dotarłem do if...fi
instrukcji, przestało działać. Oto mój kod:
#!/usr/bin/env bash
#
echo 'Hello'
#
if [ 1 -eq 1 ]
then
echo 'Success'
fi
echo 'Hello Again'
Dane wyjściowe to
>./test.sh
Hello
./test.sh: line 10: syntax error: unexpected end of file
Nie mogę z mojego życia dowiedzieć się, co się dzieje. Skopiowałem / wkleiłem instrukcje i wypróbowałem różne typy wyrażeń, ale wydaje się, że wcale nie rejestruje if
.
Może źle skonfigurowałem cygwin?
Odpowiedzi:
Cóż ... Czuję się głupio. Ale odpowiem na to pytanie dla każdego, kto ma ten sam problem.
Ponieważ rozwijam się na komputerze z systemem Windows, używa końcówek linii CRLF. Używam Sublime Text i nigdy nie myślę o zakończeniach linii, ponieważ zawsze rozwijam się dla systemu Windows.
Ale oczywiście skrypty bash muszą używać końcówek linii LF, w przeciwnym razie zdarzają się dziwne rzeczy. Nie mogłem powiedzieć, dlaczego pozwala na
echo
wykonywanie poleceńif...fi
, a kiedy nie , ale kiedy zmieniłem zakończenia linii na LF, wszystko działało tak, jak można się było spodziewać.źródło
bash
. Nie zauważyłem wcześniej problemu z nowymi liniami CR / LF, ponieważ zbędne CR powinny być traktowane jako białe znaki, ale kiedy dodałem CR do wklejonego skryptu, dostałem ten sam błąd. Jednak, kiedy zauważył na zewnątrzif
,then
ifi
linie, wszystkieecho
polecenia działało zgodnie z oczekiwaniami. Podniosłeś interesujący problem, a ja zbadam dalej, ale nie dzisiaj.#
linii nie wpływa na to, że są liniami komentarzy, podczas gdyecho
linie z końcowymi CR są nadal poprawną składnią, biorąc końcowe CR jako część tekstu do wydruku.if
I[
prawidłowo przetwarzane, a]
,then
afi
nie ze względu na załączonym CR, a koniec pliku napotkano przed zakończenieif
składni jest zakończona.Działa to dla mnie, ale jeśli zmienię zakończenie linii na styl DOS (zakończenie linii CR / LF)
więc przekonwertuj skrypt na styl uniksowy (LF jako koniec linii)
źródło