我有一个非常简单的shell脚本,它在if-else处失败。我无法理解什么是错的。我检查了我的语法和缩进。
echo_usr()
{
read -p "Do you want to preserve $EIP_HOME/conf and $EIP_HOME/installer/.datastore? [Y/N] " usr_in
kill_java()
if [ "$usr_in" == "y*" ] || [ "$usr_in" == "Y*" ]; then
preserve_conf()
else
if [ "$usr_in" == "n*" ] || [ "$usr_in" == "N*" ]; then
reset_home_eip()
else
echo "Invalid input"
fi
fi
reset_db()
}
它给了我以下错误: 意外令牌'else'
附近的语法错误答案 0 :(得分:6)
要调用不带参数的函数,只需使用函数的名称即可。空括号不是必需的,实际上是语法错误。 (或者,更确切地说,它是函数定义的语法的一部分,如果您尝试将其用作函数调用,您将在以后收到语法错误消息 - 如果您很幸运。)
这个想法是对shell函数的调用看起来就像调用外部程序一样。
例如,更改:
preserve_conf()
到
preserve_conf
(使用elif
而不是else
后跟if
是一个好主意,但这不是您所看到的问题的原因。)
在你遇到语法错误之后,你将看不到另一个问题(感谢Sam在评论中指出它)。这样:
if [ "$usr_in" == "y*" ] || [ "$usr_in" == "Y*" ]; then
无法正常工作; ==
/ [
内置的test
运算符不执行通配符匹配。如果您使用的是bash,则可以使用[[
而不是[
,并且还可以将y
和Y
个案合并为一个模式:
if [[ "$usr_in" == [yY]* ]] ; then
...
elif [[ "$usr_in" == [nN]* ]] ; then
...
fi
如果您没有支持该语法的shell,那么case
语句可能是您的下一个最佳选择 - 实际上它可能比if
版本更清晰:
case "$usr_in" in
[yY]*)
...
;;
[nN]*)
...
;;
*)
...
;;
esac