Erreur de syntaxe: fin de fichier inattendue - script Bash [fermé]

20

J'essaie de créer une application spritz. Tout fonctionnait bien, mais depuis hier, je reçois toujours cette erreur:

./spritz: ligne 176: erreur de syntaxe: fin de fichier inattendue

J'ai vérifié le fichier de script et tout semble parfait. Je suis confus, j'ai enfin une déclaration if et ça a l'air correct! Voici la dernière partie:

#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

Qu'est-ce qui pourrait provoquer cette erreur?

Scott Pearce
la source
(0) Il aurait peut-être été plus utile de nous montrer un diff de la dernière version qui fonctionnait. ……………………… Quelques observations (qui ne se rapportent probablement pas à votre problème spécifique actuel): (1) Je ne connais aucune circonstance où vous ayez besoin d'un ;(point-virgule) non échappé à la fin d'une ligne . Vous pouvez supprimer les points-virgules à la fin des lignes 157, 161, 165, 168 et 169. (Ou vous pouvez les laisser; je suppose que c'est une question de style.)… (Suite)
Scott
1
(Suite)… (2) Vous devriez toujours citer des variables de shell à moins d'avoir une bonne raison de ne pas le faire et d'être sûr de savoir ce que vous faites; par exemple, "$1", "$2", "$SECONDS"et "$starttime". (3) Il est plus facile de lire et de déboguer du code mis en retrait correctement. (4) Pourquoi configurez-vous FSet ne l'utilisez-vous pas? (5) `…`peut être écrit $(…). (6) $(($SECONDS - $starttime))peut être écrit de manière équivalente $((SECONDS - starttime)). Encore une fois, c'est essentiellement une question de style. (7) Pourquoi imprimez-vous "$words_read"dans la boucle alors que vous ne le modifiez pas dans la boucle?
Scott
Voici une approche de débogage: essayez de supprimer les lignes 157-174 et de relancer le script. Si vous obtenez toujours l'erreur (probablement signalée comme étant à la ligne 157 ou 158), alors vous savez que le problème ne se trouve pas aux lignes 157-174, et vous devez regarder plus loin en arrière (donc, répétez le processus jusqu'à ce que l'erreur disparaisse ). … (Suite)
Scott
(Suite)… Une fois l'erreur disparue, remettez les dernières lignes que vous avez supprimées et commencez à les réduire. Par exemple, si la suppression des lignes 157-174 fait disparaître l'erreur, remettez-les en place, puis supprimez les lignes 159-160, 163-168 et 171-172. Essayez de remplacer le `grep …`par une liste de valeurs. En d'autres termes, utilisez le processus d'élimination.
Scott
Remarques sur quelques-uns des commentaires de Scott: (annonce 2) si vous êtes sûr de ce que vous faites, alors (dans le code affiché) n'a "$1"besoin que de citer, (annonce 4) il voulait probablement dire IFS(et non FS)?
Janis

Réponses:

29

Le diagnostic «fin de fichier inattendue» indique que vous avez une construction syntaxique d'ouverture inégalée ou non terminée ( ifsans fi, dosans doneparenthèse, entre parenthèses ouvrantes sans fermeture associée, guillemets ouvrants mais non terminés, etc.). Le numéro de ligne pointant vers la fin du script n'est pas utile dans ce cas, au-delà de dire d'inspecter vos constructions syntaxiques; l'erreur peut se trouver n'importe où dans votre code. Vous devez vérifier cela.

Janis
la source
Merci pour la réponse. J'ai trouvé l'erreur et l'ai corrigée!
Scott Pearce
- L'erreur peut être n'importe où dans votre code. Compte créé juste pour voter pour ce conseil.
user340352