Wybacz mi, że to bardzo prosty skrypt w Bash. Oto kod:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
po uruchomieniu sh file.sh:
błąd składni: nieoczekiwany koniec pliku
Kolejna rzecz do sprawdzenia (właśnie wydarzyła mi się):
To znaczy ten niewinnie wyglądający fragment spowoduje ten sam błąd:
Aby uszczęśliwić głupiego parsera:
źródło
;
to, że oczekiwane jest zakończenie instrukcji Every;
tak, że na końcu np .:if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
spowoduje to błąd, natomiastif [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
nie ... zwróć uwagę na małe średniki na końcu, czyli: after.bash
ifi
.zsh
użytkownika. Ten pierwszy działa,zsh
ale nie działa wsh
norbash
. Chciałbym mieć 4 osoby, abym mógł oddać te 4 głosy zawłaśnie otrzymałem ten komunikat o błędzie, używając niewłaściwej składni w
if
klauzulielse if
(błąd składni: nieoczekiwany koniec pliku)elif
(poprawna składnia)debugowałem go, komentując fragmenty, dopóki nie zadziałało
źródło
niezamknięta klauzula if => fi również to podniesie
wskazówka: użyj pułapki do debugowania, jeśli twój skrypt jest ogromny ...
na przykład
źródło
unexpected end of file
błąd wystąpi natychmiast pofi
trafieniu.Otrzymałem tę odpowiedź z tego podobnego problemu na StackOverflow
Otwórz plik w Vimie i spróbuj
:set fileformat=unix
Dzięki @lemongrassnginger
źródło
dos2unix
zgodnie z zaleceniami zaakceptowanej odpowiedzi.na cygwin potrzebowałem: -
w .bash_profile. W ten sposób nie musiałem uruchamiać unix2dos
źródło
Więc znalazłem ten post, a odpowiedzi mi nie pomogły, ale udało mi się dowiedzieć, dlaczego spowodował błąd. mam
Problem polegał na tym, że skopiowałem powyższy kod, aby był w funkcji i nieumyślnie wstawiłem kod tabulatorem. Należy się upewnić, że ostatni EOF nie jest umieszczony na karcie.
źródło
EOF
wcięcie o cztery spacje i przez to bash go nie przeanalizował. Usunięcie spacji rozwiązało problem.Miałem problem, gdy napisałem instrukcję „if-fi” w jednej linii:
Napisz multiline rozwiązał mój problem:
źródło
Działo się to u mnie, gdy próbowałem wywołać funkcję za pomocą parenów, np
Powinien być:
źródło
DLA WINDOWSA:
W moim przypadku pracowałem na systemie operacyjnym Windows i wystąpił ten sam błąd podczas uruchamiania autoconf.
Następnie przekonwertowałem plik z konwersją EOL na Windows (CR LF) w następujący sposób:
EDYCJA -> KONWERSJA EOL -> WINDOWS (CR LF)
źródło
Udało mi się wyciąć i wkleić twój kod do pliku i działał poprawnie. Jeśli wykonasz to w ten sposób, powinno działać:
Twój „file.sh”:
Komenda:
Pamiętaj, że plik „file.sh” musi być wykonywalny:
Możesz otrzymać ten błąd b / c tego, jak robisz dane wejściowe (z rurką, marchewką itp.). Możesz również spróbować podzielić warunek na dwie części:
Lub, ponieważ używasz
bash
, możesz użyć wbudowanej składni:I na koniec, możesz oczywiście po prostu sprawdzić, czy podano 3 argumenty (czyste, zachowuje zgodność powłoki POSIX):
źródło
Brak nawiasu zamykającego w definicji funkcji spowoduje ten błąd, tak jak właśnie odkryłem.
Która oczywiście powinna wyglądać tak ...
źródło
Właśnie wyciąłem i wkleiłem twój przykład do pliku; działało dobrze pod bash. Nie widzę z tym żadnych problemów.
Na wszelki wypadek możesz chcieć upewnić się, że kończy się znakiem nowej linii, chociaż bash nie powinien się tym przejmować. (U mnie działa zarówno z ostatnią nową linią, jak i bez niej.)
Czasami zobaczysz dziwne błędy, jeśli przypadkowo osadziłeś znak kontrolny w pliku. Ponieważ jest to krótki skrypt, spróbuj utworzyć nowy skrypt, wklejając go z pytania tutaj w StackOverflow lub po prostu wpisując go ponownie.
Jakiej wersji basha używasz? (
bash --version
)Powodzenia!
źródło
Upewnij się, że nazwa katalogu, w którym znajduje się plik .sh, nie zawiera spacji. np .: Powiedz, że jeśli znajduje się on w folderze o nazwie „Nowy folder”, z pewnością natrafisz na zacytowany błąd. Zamiast tego nadaj mu nazwę „Nowy_folder”. Mam nadzieję, że to pomoże.
źródło
Najwyraźniej niektóre wersje powłoki mogą również emitować ten komunikat, gdy w ostatnim wierszu twojego skryptu brakuje znaku nowej linii.
źródło
W Ubuntu:
Wtedy,
File -> Save as
i ustawićend line
naUnix/Linux
źródło
Wiem, że jestem za późno na przyjęcie. Mam nadzieję, że to może komuś pomóc.
Sprawdź swój plik .bashrc. Być może zmień jego nazwę lub przenieś go.
Dyskusja tutaj: Nie można pobrać prostego skryptu bash
źródło
Dla osób używających MacOS:
Jeśli otrzymałeś plik w formacie Windows i chciałeś uruchomić na MacOS i widzisz ten błąd, uruchom te polecenia.
źródło
W moim przypadku jest to zbędne
\
w następującym:Istnieje NIE
\
na koniecDATA.PATH_PREFIX ./afs/kinetics400
źródło