我有一个非常简单的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()
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:意外令牌附近的语法错误`else'
要调用不带参数的函数,只需使用函数的名称即可.空括号不是必需的,实际上是语法错误.(或者,更确切地说,它是函数定义语法的一部分,如果您尝试将其用作函数调用,您将在以后收到语法错误消息 - 如果您很幸运的话.)
这个想法是对shell函数的调用看起来像一个外部程序的调用.
例如,更改:
preserve_conf()
Run Code Online (Sandbox Code Playgroud)
至
preserve_conf
Run Code Online (Sandbox Code Playgroud)
(使用elif而不是else跟随if是一个好主意,但这不是你所看到的问题的原因.)
还有另一个问题,在你超越语法错误之前你不会看到(感谢Sam在评论中指出它).这个:
if [ "$usr_in" == "y*" ] || [ "$usr_in" == "Y*" ]; then
Run Code Online (Sandbox Code Playgroud)
不能正常工作;/内置==使用的运算符不进行通配符匹配.如果你正在使用bash,你可以使用而不是,你也可以将和case 组合成一个模式:[test[[[yY
if [[ "$usr_in" == [yY]* ]] ; then
...
elif [[ "$usr_in" == [nN]* ]] ; then
...
fi
Run Code Online (Sandbox Code Playgroud)
如果您没有支持该语法的shell,那么case声明可能是您的下一个最佳选择 - 实际上它可能比if版本更清晰:
case "$usr_in" in
[yY]*)
...
;;
[nN]*)
...
;;
*)
...
;;
esac
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |