2014-10-07 32 views
2

假設我有一個函數foo這需要兩個參數並返回true或false,我想在bash測試[命令中使用它,一些這樣的事如何與bash的測試中參數函數[

param1=one 
param2=two 
if [ foo $param1 $param2 ]; then 
    do something 
fi 

我知道這個作品使用[]喜歡這一點,

if foo $param1 $param2; then ..... 

但我想在[]與使用它。

+0

你想要什麼,命令的輸出代碼或它返回的內容? – fedorqui 2014-10-07 15:49:30

+2

如果它沒有使用括號(使用退出狀態),那麼不需要使用'test'命令運行。 – chepner 2014-10-07 16:04:34

+0

**你爲什麼要在'test'裏面使用它?你是否試圖測試它是否發出輸出,而不是退出狀態? – 2014-10-07 17:52:19

回答

3

是否的退出狀態您命令表示成功或失敗,完全捨棄括號;在那個用例中使用test命令是錯誤的,全程停止。

在這種情況下,

if foo "$param1" "$param2"; then ...; fi 

是唯一正確的語法,不會不必要低效的。


這當然可能發出$?你的子內,並檢查使用test的輸出,就像這樣:

if [ "$(foo "$param1" "$param2" >&2; echo "$?")" -eq 2 ]; then ...; fi 

...但再次看到重:「不必要低效」 ;這將更好的寫法如下:

foo "$param1" "$param2"; retval=$? 
if [ $retval -eq 2 ]; then ...; fi 

...避免不必要的子shell的所有開銷。


如果你想測試你的命令的輸出是否非空(通常是不可取/不必要的操作,因爲大多數標準UNIX命令,可以指示是否正常運行,是否發現它們是什麼通過退出狀態搜索等):

if [ -n "$(foo "$param1" "$param2")" ]; then ...; fi 

是正確的。要牢記


一個重要的事情 - 任何使用$()從父shell(從而能夠更新或修改殼體的狀態)成子shell中運行你的移動功能。所以 - 如果你的函數應該改變shell中的變量或狀態,使用$()將會修改它的行爲。

+0

真棒回答。謝謝。 – user3207575 2014-10-08 06:41:38

2

test[ ]評估表達式,而不是退出狀態的一個函數。

爲了評估功能/命令的退出狀態,使用的方式if你使用它:如果你想測試

if foo "$param1" "$param2"; then .....