我正在尝试创建一个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
是什么导致该错误?
(续)…(2)除非有充分的理由不这样做并且您确定自己知道自己在做什么,否则应始终引用shell变量。例如
—
Scott
"$1"
,"$2"
,"$SECONDS"
,和"$starttime"
。(3)更容易阅读和调试正确缩进的代码。(4)为什么要设置FS
然后不使用它?(5)`…`
可以写成$(…)
。(6)$(($SECONDS - $starttime))
可以等效地写成$((SECONDS - starttime))
。同样,这基本上是样式问题。(7)"$words_read"
在循环中不进行修改时,为什么要在循环中打印?
这是一种调试方法:尝试删除第157-174行并再次运行脚本。如果仍然出现错误(可能报告为第157或158行),则说明问题不在 157-174行,因此您必须往后看(因此,重复此过程直到错误消失) )。…(续)
—
Scott
(续)…一旦错误消失,将最后删除的行放回去,然后开始消磨它们。例如,如果删除行157-174确实使错误消失了,请将它们放回去,然后删除行159-160、163-168和171-172。尝试将其替换
—
Scott
`grep …`
为值列表。换句话说,使用消除的过程。
评论一下Scott的一些评论:(广告2)如果您确定自己在做什么(在发布的代码中),只需
—
Janis 2015年
"$1"
引用(广告4),可能是他的意思IFS
(而不是FS
)?
;
在行尾使用未转义的(分号) 。您可以删除第157、161、165、168和169行结尾处的分号。(或者您可以将其保留;我想这是样式问题。)…(续)