2012-05-14 37 views
12

在我的bash腳本中,我有一個函數爲以後的主函數的條件返回0或1(true或false)。在bash腳本中遇到「一元運算符預期」

function1() { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then 
     return 1 
    else 
     return 0 
    fi 
} 

然後在我的主要功能:

main() { 
    for arg in ${@} ; do 
     if [ function1 ${arg} ] ; then 
      ... 
     elif [ ... ] ; then 
      ... 
     fi 
    done 
} 

然而,當我運行此腳本,它總是給我一個錯誤味精「[:功能1:一元運算符預期」

誰能幫助我好嗎?

+1

請注意,至少在bash版本4中,不應該引用正則表達式:這樣做會強制實現簡單的字符串匹配 - [記錄在此](http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57)。另外,你應該在引用中使用'for $ for $',或者簡單地使用'for arg;做...' –

+1

你應該把你的正則表達式放在一個變量中。 'pattern ='^ ...一些正則表達式... $';如果[[$ 1 =〜$ pattern]]'。請注意,在雙方括號內,沒有必要引用變量,正如glenn所說,不應引用正則表達式(變量)。 –

回答

28

假設[if命令語法的一部分,這是常見的錯誤。不是這樣;的if的語法很簡單

if command; then 
    ... things which should happen if command's result code was 0 
else 
    ... things which should happen otherwise 
fi 

一個我們使用普通command S的[這是命令test的別名。這是比較字符串,數字和文件的簡單命令。它接受一個相當窄的參數組合,並且如果你不傳遞期望的參數,它往往會產生令人困惑和誤導性的錯誤消息。 (或者說,一旦您習慣了錯誤消息就足夠了並且有幫助,但是如果您不習慣這些錯誤消息很容易被誤解)。

在您的main函數中,調用[似乎放錯了位置。你可能的意思是

if function "$arg"; then 
    ... 
elif ... ; then ... 

順便說一句,爲了好的措施,你也應該總是引用你的字符串。使用"$1"而不是$1"$arg"而不是$arg

test作爲作者不希望作爲if語法的一部分的東西的一般廚房水槽的歷史原因是原始Bourne殼的不太吸引人的設計之一。 Bash和zsh提供了不太笨拙的替代方案(例如bash中的[[雙括號,您在function1定義中使用這兩個方括號),當然POSIX test比貝爾實驗室最初創建的版本要好得多。

作爲附加說明,你的函數可以簡化爲只

function1() { 
    ! [[ "$1" =~ "^ ...some regexp... $" ]] 
} 

即,[[執行測試和反轉其結果代碼。 (「正常」情況下返回0表示成功,但也許你試圖驗證字符串不匹配?)

+0

那些......代表$ {1}之後的腳本,在我的實際腳本中,我仔細地將腳本和括號分開一個空格。所以我不認爲這是 –

+0

的問題不,我的函數1實際上檢查$ 1是否匹配某種正則表達式。而我的功能1可以很好地獨立工作。所以我認爲在我的主要功能 –

+0

中存在一些問題哦,對不起,錯過了'main'中的錯誤。感謝提示。基本分析仍然存在; '''不是你想象的那樣。 – tripleee

相關問題