Bash不允许在case语句内部使用if语句

4

有人能帮我找出我在这个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
与此案件无关。 - Keith Thompson
3个回答

11
在Bash中,if必须位于then之前:
if [[ "$PROJN" == "ONE" ||  "$PROJN" == "two" ]] ; then ESC=hello_linux ; fi

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

4
需要的是 ESC=hello_linux 而不是 ESC = hello_linux;空格会使得这个命令被解释为一个带有两个参数“=”和“hello_linux”的ESC命令。 - Charles Duffy

7
以下语法是更简洁的替代方案:
[[ $PROJN = ONE || $PROJN = TWO ]] && ESC=hello_linux

以下内容更短,适用于旧版本的shell:

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

1
@devnull 不,我真的不这么认为。当不需要引用时最好引用,而不是在需要引用时不引用。 - Charles Duffy

1
在case语句中使用if没有问题。问题在于你的if语句有一点错误。你把if语句放在了与$ESC赋值相同的行上,这不适用于case之外也不适用于case之内。此外,你需要在if语句中使用-o表示或,并且如果if语句为true,至少需要有一行代码执行(我只是放了一个echo作为占位符)。可能这个if语句应该放在case之外。我注意到它们都是相同的。在这种情况下,没有必要复制代码,只需在esac之后放置if语句即可。顺便说一下:你可以用以下两种方式之一在if语句中进行或操作:
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
}

2
[[ ]] 中使用 -o 是错误的,应该使用 || 运算符。 - Charles Duffy
1
进一步解释Charles的评论,-o[ ]内也已被弃用。在这种情况下,您应该使用[ ] || [ ](两个单独的test命令)代替。 - chepner
[[ '' -o true ]] 不是“两种方式之一”,在bash中它是完全不支持的(至少在由Apple提供的bash 3.2.57中如此;我还没有测试所有其他现有版本)。试试看:-bash: syntax error near `-o'。你用哪个shell进行测试,它没有抛出这样的错误? - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接