2

我有一个非常简单的 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”附近的语法错误

4

1 回答 1

6

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

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

例如,更改:

preserve_conf()

preserve_conf

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

在解决语法错误之前,您不会看到另一个问题(感谢 Sam 在评论中指出)。这个:

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

不能正常工作;/内置的==运算符不进行通配符匹配。如果你使用 bash,你可以使用而不是,你也可以将and组合成一个模式:[test[[[yY

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

如果您没有支持该语法的 shell,那么case语句可能是您的下一个最佳选择——事实上,这可能比if版本更简洁:

case "$usr_in" in
    [yY]*)
        ...
        ;;
    [nN]*)
        ...
        ;;
    *)
        ...
        ;;
esac
于 2013-08-22T21:22:19.183 回答