Errore di sintassi: fine imprevista del file - Script Bash [chiuso]


20

Sto cercando di creare un'app spritz. Tutto funzionava bene, ma da ieri continuo a ricevere questo errore:

./spritz: riga 176: errore di sintassi: fine imprevista del file

Ho controllato il file di script e tutto sembra perfetto. Sono confuso, ho finalmente un'istruzione if e sembra corretto! Ecco l'ultima parte:

#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

Cosa potrebbe causare questo errore?


(0) Potrebbe essere stato più utile mostrarci un diff dall'ultima versione che ha funzionato. ... ... ... ... ... ... ... ... Alcune osservazioni (che probabilmente non riguardano il tuo attuale problema specifico): (1) Non conosco alcuna circostanza in cui hai bisogno di un ;punto di fuga (punto e virgola) alla fine di una riga . Puoi eliminare i punti e virgola alle estremità delle righe 157, 161, 165, 168 e 169. (O puoi lasciarli dentro; suppongo sia una questione di stile.) ... (continua)
Scott

1
(Proseguendo) ... (2) Dovresti sempre citare le variabili della shell a meno che tu non abbia una buona ragione per non farlo e sei sicuro di sapere cosa stai facendo; ad esempio, "$1", "$2", "$SECONDS", e "$starttime". (3) È più facile leggere ed eseguire il debug del codice indentato correttamente. (4) Perché si imposta FSe quindi non lo si utilizza? (5) `…`può essere scritto $(…). (6) $(($SECONDS - $starttime))può essere scritto in modo equivalente $((SECONDS - starttime)). Ancora una volta, questo è fondamentalmente un problema di stile. (7) Perché stampi "$words_read"nel ciclo quando non lo modifichi nel ciclo?
Scott,

Ecco un approccio di debug: prova a eliminare le righe 157-174 ed eseguire nuovamente lo script. Se ricevi ancora l'errore (probabilmente segnalato come nella riga 157 o 158), allora sai che il problema non è nelle righe 157-174 e devi guardare più indietro (quindi, ripeti il ​​processo fino a quando l'errore scompare ). ... (proseguendo)
Scott

(Proseguendo) ... Una volta che l'errore scompare, rimetti le ultime righe che hai eliminato e inizia a sbriciolarle. Ad esempio, se l'eliminazione delle righe 157-174 fa scomparire l'errore, reinserirle, quindi eliminare le righe 159-160, 163-168 e 171-172. Prova a sostituire il `grep …`con un elenco di valori. In altre parole, utilizzare il processo di eliminazione.
Scott,

Osservazioni su alcuni dei commenti di Scott: (annuncio 2) se sei sicuro di cosa stai facendo (nel codice pubblicato) devi solo "$1"citare, (annuncio 4) probabilmente intendeva IFS(e non FS)?
Janis,

Risposte:


29

La "fine imprevista del file" diagnostica indica che hai un costrutto sintattico di apertura senza eguali o non terminato ( ifw / o fi, dow / o done, parentesi di apertura senza quella di chiusura associata, apri ma virgolette non terminate, ecc.). Il numero di riga che punta alla fine dello script non è utile in questo caso, oltre a dire di ispezionare i costrutti sintattici; l'errore potrebbe essere ovunque nel tuo codice. Devi controllare quello.


Grazie per la risposta. Ho trovato l'errore e risolto!
Scott Pearce,

- l'errore potrebbe trovarsi in qualsiasi punto del codice. Account creato solo per migliorare questo consiglio.
user340352
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.