下面是我编写的一个 shell 脚本,当我尝试执行它时,我的终端中出现一个描述“expecting fi”关键字的错误。我把它写在 done 关键字之前,但仍然没有设法克服这个错误。有人能告诉我如何解决这个错误,以及我的方法中哪里出了错吗?
VAL1=0
VAL2=0
while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
do read -p "Enter values for both numbers" VAL1 VAL2
if [ "$VAL1" -eq 99 ] || [ "$VAL1" -eq 99 ]
then break
else read -p "Enter value number two" VAL2
if [ "$VAL2" -eq 0 ]
then echo "Cannot divide by zero"
else echo $(( VAL1 / VAL2 ))
fi
done
答案1
“Expecting fi
” 表示您的脚本缺少此关键字。您的例子中有两个if
s,但只有一个fi
,第一个未关闭。请将其更正为:
else echo $(( VAL1 / VAL2 ))
fi
fi
done
为了调试 shell 脚本,最好使用外壳检查任何一个在线的或者通过命令shellcheck
(sudo apt install shellcheck
):
$ shellcheck myscript
Line 4:
while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
^-- SC1009: The mentioned syntax error was in this while loop.
Line 6:
if [ "$VAL1" -eq 99 ] || [ "$VAL1" -eq 99 ]
^-- SC1046: Couldn't find 'fi' for this 'if'.
^-- SC1073: Couldn't parse this if expression. Fix to allow more checks.
Line 13:
done
^-- SC1047: Expected 'fi' matching previously mentioned 'if'.
^-- SC1072: Unexpected keyword/token. Fix any mentioned problems and try again.
答案2
正如 dessert 已经指出的那样,有两个if
s 但只有一个fi
会立即告诉您条件语句中的某处不匹配。
我建议的一件事是,在编码时,使用缩进有助于确定是否缺少任何结构。保持你的if-then-else-fi
在同一列中是一种可以用来跟踪这些事情的技巧。同样适用于case-esac
或do-done
。
使用您的示例代码,如果我们以这种方式缩进,那么缺少某些内容就会很明显:
VAL1=0
VAL2=0
while [ "$VAL1" -eq 0 ] && [ "$VAL2" -eq 0 ]
do
read -p "Enter values for both numbers" VAL1
if [ "$VAL1" -eq 99 ] || [ "$VAL1" -eq 99 ]
then
break
else
read -p "Enter value number two" VAL2
if [ "$VAL2" -eq 0 ]
then
echo "Cannot divide by zero"
else
echo $(( VAL1 / VAL2 ))
fi
?? <------ *Missing fi would likely have been detected here*
done