if else语句在shell脚本中失败

its*_*tsh 2 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()
}
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:意外令牌附近的语法错误`else'

Kei*_*son 6

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

这个想法是对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)