cygwin bash - jeśli instrukcja nie działa


0

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...fiinstrukcji, 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?


Może brakuje Ci średnika? Spróbuj „jeśli [...]; następnie”. Zwróć uwagę na średnik za nawiasami kwadratowymi.
jehad

Wiem też, że dwukropek z wieloma wyrażeniami jest po prostu stylistyczny, ale może coś w wersji cygwin potrzebuje tego !? Nie wiem, nie jest facetem z Windows. :)
jehad

Odpowiedzi:


0

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 echowykonywanie 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ć.


Skrypt wyglądał OK, a po skopiowaniu i wklejeniu do Ubuntu działał dobrze 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ątrz if, theni filinie, wszystkie echopolecenia działało zgodnie z oczekiwaniami. Podniosłeś interesujący problem, a ja zbadam dalej, ale nie dzisiaj.
AFH,

1
Myślę, że doszedłem do sedna: CR najwyraźniej nie jest traktowany jako biała spacja, ale jako znak tekstowy. Dołączenie CR do #linii nie wpływa na to, że są liniami komentarzy, podczas gdy echolinie z końcowymi CR są nadal poprawną składnią, biorąc końcowe CR jako część tekstu do wydruku. ifI [prawidłowo przetwarzane, a ], thena finie ze względu na załączonym CR, a koniec pliku napotkano przed zakończenie ifskładni jest zakończona.
AFH

0

Działa to dla mnie, ale jeśli zmienię zakończenie linii na styl DOS (zakończenie linii CR / LF)

$ u2d ./prova.sh
unix2dos: converting file ./prova.sh to DOS format...

$ ./prova.sh
Hello
./prova.sh: line 10: syntax error: unexpected end of file

więc przekonwertuj skrypt na styl uniksowy (LF jako koniec linii)

$ d2u ./prova.sh
dos2unix: converting file ./prova.sh to Unix format...
$ ./prova.sh
Hello
Success
Hello Again
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.