if else语句在shell脚本中失败

时间:2013-08-22 21:10:27

标签: shell

我有一个非常简单的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'

附近的语法错误

1 个答案:

答案 0 :(得分:6)

要调用不带参数的函数,只需使用函数的名称即可。空括号不是必需的,实际上是语法错误。 (或者,更确切地说,它是函数定义的语法的一部分,如果您尝试将其用作函数调用,您将在以后收到语法错误消息 - 如果您很幸运。)

这个想法是对shell函数的调用看起来就像调用外部程序一样。

例如,更改:

preserve_conf()

preserve_conf

(使用elif而不是else后跟if是一个好主意,但这不是您所看到的问题的原因。)

在你遇到语法错误之后,你将看不到另一个问题(感谢Sam在评论中指出它)。这样:

if [ "$usr_in" == "y*" ] || [ "$usr_in" == "Y*" ]; then

无法正常工作; == / [内置的test运算符不执行通配符匹配。如果您使用的是bash,则可以使用[[而不是[,并且还可以将yY个案合并为一个模式:

if [[ "$usr_in" == [yY]* ]] ; then
    ...
elif [[ "$usr_in" == [nN]* ]] ; then
    ...
fi

如果您没有支持该语法的shell,那么case语句可能是您的下一个最佳选择 - 实际上它可能比if版本更清晰:

case "$usr_in" in
    [yY]*)
        ...
        ;;
    [nN]*)
        ...
        ;;
    *)
        ...
        ;;
esac