语法错误:文件意外结束-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行结尾处的分号。(或者您可以将其保留;我想这是样式问题。)…(续)
Scott

1
(续)…(2)除非有充分的理由不这样做并且您确定自己知道自己在做什么,否则应始终引用shell变量。例如"$1""$2""$SECONDS",和"$starttime"。(3)更容易阅读和调试正确缩进的代码。(4)为什么要设置FS然后不使用它?(5)`…`可以写成$(…)。(6)$(($SECONDS - $starttime))可以等效地写成$((SECONDS - starttime))。同样,这基本上是样式问题。(7)"$words_read"在循环中不进行修改时,为什么要在循环中打印?
Scott

这是一种调试方法:尝试删除第157-174行并再次运行脚本。如果仍然出现错误(可能报告为第157或158行),则说明问题不在 157-174行,因此您必须往后看(因此,重复此过程直到错误消失) )。…(续)
Scott

(续)…一旦错误消失,将最后删除的行放回去,然后开始消磨它们。例如,如果删除行157-174确实使错误消失了,请将它们放回去,然后删除行159-160、163-168和171-172。尝试将其替换`grep …`为值列表。换句话说,使用消除的过程。
Scott

评论一下Scott的一些评论:(广告2)如果您确定自己在做什么(在发布的代码中),只需"$1"引用(广告4),可能是他的意思IFS(而不是FS)?
Janis 2015年

Answers:


29

诊断性“文件结尾意外”表示您具有一些不匹配或未终止的开头语法结构(ifw / o fidow / o done,不包含相关的结束语的左括号,开头但未终止的引号等)。在这种情况下,指向脚本末尾的行号无助于检查语法结构。该错误可能在您的代码中的任何地方。你必须检查一下。


谢谢回复。我发现了错误并解决了!
Scott Pearce 2015年

-错误可能在代码中的任何地方。创建帐户只是为了支持该建议。
user340352
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.