Błąd składni: nieoczekiwany koniec pliku - skrypt Bash [zamknięty]

20

Próbuję utworzyć aplikację spritz. Wszystko działało dobrze, ale od wczoraj ciągle pojawia się ten błąd:

./spritz: linia 176: błąd składniowy: nieoczekiwany koniec pliku

Sprawdziłem plik skryptu i wszystko wydaje się idealne. Jestem zmieszany, mam w końcu zdanie if i wygląda poprawnie! Oto ostatnia porcja:

#checks if speed is 150
157 if [[ $2 -eq 150 ]];
158 then
159 starttime=$SECONDS
160      FS=$'\n'
161      for j in `grep --color=always -iP '\b[^aeiou\s]*[aeiou][^aeiou\s]*\K[aeiou]' $1`;
162      do
163            #Reads the text file in the centre of the screen
164            echo "                                                    ___________________"
165            echo "                                                             $j";
166            echo "                                                    ___________________"
167            echo "                                                                               Speed 150 wpm"
168            sleep  0.9;
169            clear;
170       done
171 endtime=$(($SECONDS - $starttime))
172            echo "You read $words_read words in $endtime seconds!"
173       exit 8
174 fi

Co może powodować ten błąd?

Scott Pearce
źródło
(0) Mogłoby być bardziej przydatne pokazanie nam różnic w stosunku do ostatniej działającej wersji. …………………… Niektóre spostrzeżenia (które prawdopodobnie nie odnoszą się do twojego obecnego, konkretnego problemu): (1) Nie znam żadnych okoliczności, w których potrzebujesz nieskalowanego ;(średnika) na końcu linii . Możesz usunąć średniki na końcach wierszy 157, 161, 165, 168 i 169. (Lub możesz je zostawić; Myślę, że to kwestia stylu.)… (Ciąg dalszy)
Scott
1
(Ciąg dalszy)… (2) Zawsze powinieneś cytować zmienne powłoki, chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz; na przykład "$1", "$2", "$SECONDS", i "$starttime". (3) Łatwiej jest czytać i debugować poprawnie wcięty kod. (4) Dlaczego ustawiasz, FSa następnie nie używasz? (5) `…`można zapisać $(…). (6) $(($SECONDS - $starttime))można równoważnie zapisać $((SECONDS - starttime)). Ponownie, jest to w zasadzie kwestia stylu. (7) Dlaczego drukujesz "$words_read"w pętli, kiedy nie modyfikujesz jej w pętli?
Scott
Oto podejście do debugowania: spróbuj usunąć linie 157-174 i ponownie uruchomić skrypt. Jeśli nadal pojawia się błąd (prawdopodobnie zgłaszany jako występujący w linii 157 lub 158), oznacza to, że problem nie występuje w wierszach 157-174, i musisz spojrzeć wstecz (więc powtarzaj proces, aż błąd zniknie) ). … (Ciąg dalszy)
Scott
(Ciąg dalszy)… Gdy błąd zniknie, włóż z powrotem ostatnie usunięte wiersze i zacznij z nich znikać. Na przykład, jeśli usunięcie linii 157-174 powoduje zniknięcie błędu, włóż je z powrotem, ale następnie usuń linie 159-160, 163-168 i 171-172. Spróbuj zastąpić `grep …`listą wartości. Innymi słowy, użyj procesu eliminacji.
Scott
Uwagi na temat kilku uwag Scotta: (ad 2) jeśli jesteś pewien, co robisz, to (w opublikowanym kodzie) wystarczy tylko "$1"zacytować, (ad 4) prawdopodobnie miał na myśli IFS(a nie FS)?
Janis

Odpowiedzi:

29

Diagnostyki „nieoczekiwany koniec pliku” jest wskazówką, że masz jakieś niezrównaną lub niezakończony otwarcia syntaktyczną konstrukt ( ifw / o fi, dow / o done, wsporniki otwarcia W / O związany zamknięcia jednego otworu, ale niezakończony cytatów, etc.). Numer linii wskazujący na koniec skryptu nie jest w tym przypadku pomocny, poza mówiąc o sprawdzeniu konstrukcji składniowych; błąd może znajdować się w dowolnym miejscu w kodzie. Musisz to sprawdzić.

Janis
źródło
Dziękuję za odpowiedź. Znalazłem błąd i naprawiłem go!
Scott Pearce
- błąd może znajdować się w dowolnym miejscu w kodzie. Utworzono konto tylko po to, by głosować za tą radą.
user340352