假設我有一個函數foo這需要兩個參數並返回true或false,我想在bash測試[命令中使用它,一些這樣的事如何與bash的測試中參數函數[
param1=one
param2=two
if [ foo $param1 $param2 ]; then
do something
fi
我知道這個作品使用[]
喜歡這一點,
if foo $param1 $param2; then .....
但我想在[]
與使用它。
假設我有一個函數foo這需要兩個參數並返回true或false,我想在bash測試[命令中使用它,一些這樣的事如何與bash的測試中參數函數[
param1=one
param2=two
if [ foo $param1 $param2 ]; then
do something
fi
我知道這個作品使用[]
喜歡這一點,
if foo $param1 $param2; then .....
但我想在[]
與使用它。
是否的退出狀態您命令表示成功或失敗,完全捨棄括號;在那個用例中使用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中的變量或狀態,使用$()
將會修改它的行爲。
真棒回答。謝謝。 – user3207575 2014-10-08 06:41:38
test
或[ ]
評估表達式,而不是退出狀態的一個函數。
爲了評估功能/命令的退出狀態,使用的方式if
你使用它:如果你想測試
if foo "$param1" "$param2"; then .....
你想要什麼,命令的輸出代碼或它返回的內容? – fedorqui 2014-10-07 15:49:30
如果它沒有使用括號(使用退出狀態),那麼不需要使用'test'命令運行。 – chepner 2014-10-07 16:04:34
**你爲什麼要在'test'裏面使用它?你是否試圖測試它是否發出輸出,而不是退出狀態? – 2014-10-07 17:52:19