Помилка синтаксису: несподіваний кінець файлу - сценарій Bash [закритий]


20

Я намагаюся створити додаток spritz. Все працювало чудово, але з вчорашнього дня я продовжую отримувати цю помилку:

./spritz: рядок 176: помилка синтаксису: несподіваний кінець файлу

Я перевірив файл сценарію і все здається ідеальним. Я розгублений, у мене є висновок if нарешті, і це виглядає правильно! Ось остання порція:

#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

Що може спричинити цю помилку?


(0) Можливо, було б корисніше показати нам відмінність від останньої версії, яка працювала. ... ... ... ... ... ... ... ... Деякі спостереження (що , ймовірно , не пов'язана з вашим поточним, конкретною проблемою): (1) Я не знаю ні одного обставини , коли вам потрібно неекрановані ;(точка з коми) в кінці рядка . Ви можете видалити крапки з комою в кінці рядків 157, 161, 165, 168 і 169. (Або можете залишити їх; я думаю, це питання стилю.)… (Продовження)
Скотт,

1
(Продовження)… (2) Ви завжди повинні цитувати змінні оболонки, якщо у вас немає вагомих причин цього не робити, і ви впевнені, що знаєте, що робите; наприклад, "$1", "$2", "$SECONDS"і "$starttime". (3) Простіше читати та налагоджувати код, який правильно розміщений з відступом. (4) Чому ви встановлюєте, FSа потім не використовуєте? (5) `…`можна записати $(…). (6) $(($SECONDS - $starttime))можна рівнозначно записати $((SECONDS - starttime)). Знову ж таки, це в основному питання стилю. (7) Чому ви друкуєте "$words_read"в циклі, коли ви не змінюєте його в циклі?
Скотт

Ось підхід налагодження: Спробуйте видалити рядки 157-174 та запустити сценарій ще раз. Якщо ви все-таки отримаєте помилку (ймовірно, повідомляється про те, що вона знаходиться в рядку 157 або 158), знаєте, що проблема не в рядках 157-174, і вам доведеться оглянути далі (тому повторіть процес, поки помилка не усунеться ). … (Продовження)
Скотт

(Продовжуючи)… Як тільки помилка усунеться, покладіть останні останні рядки, які ви видалили, і починайте відбігати їх. Наприклад, якщо видалення рядків 157-174 не призведе до помилки, введіть їх назад, але потім видаліть рядки 159-160, 163-168 та 171-172. Спробуйте замінити `grep …`список зі значеннями. Іншими словами, використовуйте процес усунення.
Скотт

Зауваження до кількох коментарів Скотта: (оголошення 2), якщо ви впевнені, що робите тоді (у розміщеному коді) "$1"потрібне лише цитування, (оголошення 4), мабуть, він мав на увазі IFS(а ні FS)?
Яніс

Відповіді:


29

Діагностичний "несподіваний кінець файлу" - це натяк на те, що у вас є якась незрівнянна або невстановлена ​​синтаксична конструкція відкриття ( ifбез ш, о fi, doбез done, відкриваються дужки без пов'язаного закриваючого, відкриваються, але невстановлені лапки тощо). Номер рядка, що вказує на кінець сценарію, в цьому випадку не є корисним, крім того, щоб перевірити ваші синтаксичні конструкції; помилка може бути в будь-якому місці вашого коду. Ви повинні це перевірити.


Дякую за відповідь. Я знайшов помилку і виправив її!
Скотт Пірс

- помилка може бути в будь-якому місці вашого коду. Створено обліковий запис просто для отримання цієї поради.
user340352
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.