Синтаксическая ошибка: неожиданный конец файла - скрипт 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, открывающие скобки без соответствующей закрывающей, открывающие, но не определенные кавычки и т. Д.). Номер строки, указывающий на конец скрипта, в этом случае не полезен, кроме как для проверки ваших синтаксических конструкций; ошибка может быть где угодно в вашем коде. Вы должны это проверить.

Janis
источник
Спасибо за ответ. Я нашел ошибку и исправил ее!
Скотт Пирс
- ошибка может быть где угодно в вашем коде. Создан аккаунт только для того, чтобы проголосовать за этот совет.
user340352