2013-07-30 46 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不,我真的沒有。不過,如果不需要引用時,最好引用它,儘管如此。 –