2009-06-23 104 views
0

我在bash腳本中寫了一個函數。但是,它正在抱怨語法。我實在看不出它是什麼.....錯誤消息[:缺少']」bash shell腳本語法錯誤

addem() { 
      if [ $# -eq 0] || [ $# -gt 2 ] 
      then 
        echo -1 
      elif [ $# -eq 1 ] 
      then 
        echo $[ $1 + $1 ] 
      else 
        echo $[ $1 + $2 ] 
      fi 
    } 

回答

12

在第一個]之前需要一個空格。那就是:
變化:
if [ $# -eq 0] || [ $# -gt 2 ]
到:
if [ $# -eq 0 ] || [ $# -gt 2 ]

+4

有點歷史:這是因爲'['歷史上不是shell內置的,而是一個單獨的可執行文件,它接收expresson作爲參數並返回結果。如果你沒有用空格來包圍'['',那麼shell會在$ PATH中搜索一個不同的文件名(並且沒有找到它)。 – 2009-06-24 01:13:47

3

嘗試:

if [ $# -eq 0 ] || [ $# -gt 2 ] 

(有0和之間沒有空格。 )

1

Bash對空間很敏感。在第一行中,如果[Y -eq X]替換爲[Y -eq X](在「]」之前的空格)

0

你應該避免支架和使用test代替:

if test $# -eq 0 || test $# -gt 2 
then 
    echo -1 
elif test $# -eq 1 
then 
    echo $(($1 + $1)) 
else 
    echo $(($1 + $2)) 
fi 

得到一個better shell style會讓你更好。 :)

+0

不,您應該使用雙括號而不是測試或單個括號。 – 2009-06-23 22:41:58

2

indyK1ng:「#」不被視爲註釋,因爲「$」轉義下一個字符。 「$#」是一個內部變量,表示當前上下文中存在的位置參數的數量。這可以認爲是shell腳本的命令行參數的數量,但是可以使用內置的「set - [args]」來重置該數組。

Joakim Elofsson:if語句的整體結構是正確的,「;」只在「那時」之前和「fi」之前需要,如果這些不在單獨的行中列出的話。

問題是「0」和括號之間的空格。 Bash要求用於限定條件表達式的括號至少要在表達式中留出一個空格。

 if [ $# -eq 0] || [ $# -gt 2 ] # Wrong 

     if [ $# -eq 0 ] || [ $# -gt 2 ] # Correct 

在附加說明中,可以組合兩個條件表達式。運營商協會將確保一切正常。

 if [ $# -eq 0 -a $# -gt 2 ] # Even Better 

我傾向於使用雙括號提供的擴展功能進行表達式評估。請注意,兩個評估的組合是由不同的操作員完成的。我覺得這更可讀。

 if [[ $# -eq 0 || $# -gt 2 ]] # My preference 

在腳本的稍後部分中,不建議使用單括號作爲整數加法。單個括號正在評估表達式爲布爾值。雙元素用於整數數學。

   echo $[ $1 + $1 ] # Evaluation of an expression 

       echo $(($1 + $1)) # Integer math 
1

我將使用擴展測試結構(BASH),如下圖所示。我認爲這會減少字符數量並提高可讀性(至少對於程序員來說)。 :-)

addem() { 
     if (($# == 0 || $# > 2)) 
     then 
       echo -1 
     elif (($# == 1)) 
     then 
       echo (($1 + $1)) 
     else 
       echo (($1 + $2)) 
     fi 
} 
+0

爲什麼反引號? – ghostdog74 2009-11-25 08:02:04