Bash不允许在case语句中使用if语句

时间:2013-07-30 14:29:19

标签: bash

有人可以帮我找出我在这个bash脚本上做错了什么。我试图在case语句中使用if语句,而bash抱怨语法错误。

findinfo() {
OPT1=$1
case  "$OPT1" in
   linux)
        echo "Setting environment"
        ESC="hello_linux" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
   Windows)
        echo "Setting environment"
        ESC="hello_windows" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
   Android)
        echo "Setting environment"
        ESC="hello_android" if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]]
        ;;
esac

}

由于

3 个答案:

答案 0 :(得分:10)

在bash中,if必须位于then部分之前:

if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]] ; then ESC=hello_linux ; fi

在Perl中可以使用“postfix”if(也可能在其他地方),但不能在bash中使用。

答案 1 :(得分:6)

以下语法是替代方案:

[[ $PROJN = ONE || $PROJN = TWO ]] && ESC=hello_linux

...以下内容仍然较短,并且符合较旧的shell:

case $PROJN in ONE|TWO) ESC=hello_linux ;; esac

答案 2 :(得分:1)

在case语句中使用if没有问题。这是你的if陈述有点不正确。

您的if声明与$ESC作业位于同一行。在case之外不起作用在内部不起作用。此外,您需要在-o语句中使用if作为,如果if语句为真,则至少需要执行一行。 (我只是将echo作为占位符)。

可能是这个特定的if语句应该在您的case之外。我注意到它们都是一样的。在这种情况下无需重复代码,只需将if放在esac之后。

顺便说一下:你可以用以下两种方式之一在if内部做or

if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]

if [[ "$PROJN" == "ONE" ]] || [[  "$PROJN" == "two" ]]

现在回到你的定期计划......

findinfo() {
    OPT1=$1
    case  "$OPT1" in
       linux)
            echo "Setting environment"
            ESC="hello_linux" 
            if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
       Windows)
            echo "Setting environment"
            ESC="hello_windows" 
            if [[ "$PROJN" == "ONE" -o  "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
       Android)
            echo "Setting environment"
            ESC="hello_android" 
            if [[ "$PROJN" == "ONE" -o "$PROJN" == "two" ]]
            then
                 echo "Here be dragons..."
            fi
            ;;
    esac
}