3

有人可以帮我找出我在这个 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

}

谢谢

4

3 回答 3

10

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

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

“后缀”if在 Perl 中是可能的(也可能在其他地方),但不是在 bash 中。

于 2013-07-30T14:31:58.127 回答
6

以下语法是一种更简洁的替代方法:

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

...并且以下内容仍然更短,并且与旧外壳兼容:

case $PROJN in ONE|TWO) ESC=hello_linux ;; esac
于 2013-07-30T14:42:37.610 回答
1

if使用inside a case 语句没有问题。那是你的if陈述有点不正确。

你的陈述和你的作业if在同一行。$ESC外面case不行,里面不行。此外,您需要在语句中使用for 或,-o如果的语句为真if,则至少需要执行一行。if(我只是把一个echo作为占位符)。

可能这个特定if的语句应该在你的case. 我注意到它们都是一样的。在这种情况下无需复制代码,只需将您ifesac.

顺便说一句:您可以通过or以下两种方式之一来执行 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
}
于 2013-07-30T14:42:30.273 回答