2013-07-30 42 views
2

有人可以帮我找出我在这个bash脚本中做了什么错误。我正在尝试使用case语句中的if语句,并且bash正在抱怨语法错误。Bash不允许case语句中的if语句

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

它无关了'case'。 –

回答

8

在bash,if必须先于then部分:

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

的 “后缀” if可能在Perl(也许其他地方也是如此),但不是在庆典。

+0

感谢您的快速解决方案,它的工作 – user2367078

+3

需要'ESC = hello_linux',而不是'ESC = hello_linux';空格使得这个命令带有两个参数''''和'hello_linux'。 –

1

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

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

可能是这个特定的if声明应该在您的case之外。我注意到他们都是一样的。在这种情况下无需重复代码,只需在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 
} 
+2

在[[]]内使用'-o'是错误的;它应该是'||'运算符。 –

+0

为了扩大Charles的评论,在'[]'里面'-o'也被弃用了。在那种情况下,你可以使用'[] || []'而不是(两个单独的'测试'命令)。 – chepner

5

以下语法是terser的替代方法:

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

...而下面仍然较短,并与兼容旧的贝壳:

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

+1,但是你真的需要在这里引用。 – devnull

+1

@devnull不,我真的没有。不过,如果不需要引用时,最好引用它,尽管如此。 –