Syntaxfehler: unerwartetes Dateiende - Bash-Skript [geschlossen]

20

Ich versuche eine Spritz App zu erstellen. Alles hat gut funktioniert, aber seit gestern bekomme ich immer wieder folgende Fehlermeldung:

./spritz: Zeile 176: Syntaxfehler: unerwartetes Dateiende

Ich habe die Skriptdatei überprüft und alles scheint perfekt zu sein. Ich bin verwirrt, ich habe endlich eine if-Anweisung und sie sieht richtig aus! Hier ist der letzte Teil:

#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

Was könnte diesen Fehler verursachen?

Scott Pearce
quelle
(0) Es hätte sinnvoller sein können, uns einen Unterschied zur letzten funktionierenden Version zu zeigen. ………………… Einige Beobachtungen (die sich wahrscheinlich nicht auf Ihr aktuelles, spezifisches Problem beziehen): (1) Ich kenne keinen Umstand, in dem Sie ein ;Semikolon am Ende einer Zeile benötigen . Sie können die Semikolons an den Enden der Zeilen 157, 161, 165, 168 und 169 löschen. (Oder Sie lassen sie in; ich denke, es ist eine Frage des Stils.)… (Fortsetzung)
Scott
1
(Fortsetzung)… (2) Sie sollten immer Shell-Variablen angeben, es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun. zB "$1", "$2", "$SECONDS", und "$starttime". (3) Es ist einfacher, richtig eingerückten Code zu lesen und zu debuggen. (4) Warum stellen Sie es ein FSund verwenden es dann nicht? (5) `…`kann geschrieben werden $(…). (6) $(($SECONDS - $starttime))kann äquivalent geschrieben werden $((SECONDS - starttime)). Auch dies ist im Grunde eine Frage des Stils. (7) Warum drucken Sie "$words_read"in der Schleife, wenn Sie sie nicht in der Schleife ändern?
Scott
Hier ist ein Debugging-Ansatz: Versuchen Sie, die Zeilen 157-174 zu löschen und das Skript erneut auszuführen. Wenn der Fehler weiterhin auftritt (wahrscheinlich in Zeile 157 oder 158), wissen Sie, dass das Problem nicht in den Zeilen 157 bis 174 auftritt, und müssen weiter zurückblicken (wiederholen Sie den Vorgang, bis der Fehler behoben ist ). … (Fortsetzung)
Scott
(Fortsetzung) ... Wenn der Fehler behoben ist, setzen Sie die zuletzt gelöschten Zeilen wieder ein und fangen Sie an, daran herumzuhauen. Wenn zum Beispiel das Löschen der Zeilen 157-174 dazu führt, dass der Fehler verschwindet, setzen Sie sie wieder ein, löschen Sie dann jedoch die Zeilen 159-160, 163-168 und 171-172. Versuchen Sie, das `grep …`durch eine Liste von Werten zu ersetzen . Verwenden Sie mit anderen Worten den Prozess der Eliminierung.
Scott
Anmerkungen zu ein paar Kommentaren von Scott: (zu 2) Wenn Sie sicher sind, was Sie tun, müssen Sie (im angegebenen Code) nur "$1"zitieren (zu 4), wahrscheinlich meinte er IFS(und nicht FS)?
Janis

Antworten:

29

Die Diagnose „unerwartete Ende der Datei“ ist ein Hinweis , dass Sie ein ungestörtes oder ungekündigten Öffnung syntaktisches Konstrukt haben ( ifw / o fi, dow / o done, Öffnungs Klammern w / o der damit verbundene Schließung einer, Öffnung , aber nicht abgeschlossene Kurse, etc.). Die Zeilennummer, die zum Ende des Skripts zeigt, ist in diesem Fall nicht hilfreich, außer um Ihre syntaktischen Konstrukte zu untersuchen. Der Fehler kann irgendwo in Ihrem Code sein. Das musst du überprüfen.

Janis
quelle
Danke für die Antwort. Ich habe den Fehler gefunden und behoben!
Scott Pearce
- Der Fehler kann irgendwo in Ihrem Code sein. Erstelltes Konto, nur um für diesen Rat zu stimmen.
user340352