2016-12-04 67 views
0

假設我用一個函數在if語句:失敗如果條件函數是未定義

if isSomeConditionTrue; then 
    echo "true"; 
else 
    echo "false"; 
fi 

如果isSomeConditionTrue定義這工作得很好。

但是,如果isSomeConditionTrue未被定義,例如,由於錯字或缺少導入,它的評估結果爲"false",而不是失敗。

set -u沒有什麼區別。

+0

這是一個調試問題;確保定義了「isSomeConditionTrue」。 – chepner

回答

1

我建議你if之前插入這樣的:

command_not_found_handle() { false; } 
+0

不幸的是,這似乎並不適用於老版本的Bash。 –

+0

這也只是取代127的正常退出狀態,退出狀態爲1.如果使用足夠新的'bash'版本,將'command_not_found_handle'設置爲實際退出* shell可能會有用。 – chepner

1

最終,你只需要調試腳本,並確保你有適當的進口,不作錯別字。也就是說,有一種方法可以區分一個未定義的命令和一個正常的失敗,儘管它可能不是你想在整個腳本中使用的東西。

isSomeConditionTrue 
case $? in 
    127) echo "Command not found" ;; 
    0) echo "Command succeeds" ;; 
    *) echo "Some other problem" ;; 
esac 

退出狀態127表示找不到命令。 (請注意,這意味着一個性能良好的程序本身不應返回127的狀態;請考慮保留返回值。)

+0

信息豐富,但過於冗長,特別是在組合多個條件函數時。 –