2014-10-31 85 views
49

我想知道在if語句中檢查退出狀態以回顯特定輸出的最佳方法是什麼。Bash - 如何使用if語句檢查退出狀態

我想這是

if [ $? -eq 1 ] 
then 
    echo "blah blah blah" 
fi 

我也有這個問題的是,出口語句是之前的if語句,只是因爲它必須有一個退出代碼,我知道我在做什麼因爲出口沃爾明顯會退出該計劃。

+2

Plaese發表您的完整的腳本(或至少是一個更廣泛的範圍內)。否則這看起來很好。 – RedX 2014-10-31 13:21:49

+1

如果您需要在兩個不同的地方使用某個特定程序調用的退出代碼,那麼您需要保留它 - 沿着'some_program; RC = $ ?;如果[$ {rc} -eq 1] .... fi;退出$ {rc}' – twalberg 2014-10-31 14:37:11

回答

57

每個運行的命令都有退出狀態。

該檢查查看在該行運行之前最近完成的命令的退出狀態。

如果你想你的腳本來當測試返回true退出(以前的命令失敗),那麼你把exit 1(或其他)是if塊內的echo後。

這就是說,如果你正在運行命令,並希望測試其輸出使用以下往往更直截了當。

if some_command; then 
    echo command returned true 
else 
    echo command returned some error 
fi 

或打開,大約用!爲否定

if ! some_command; then 
    echo command returned some error 
else 
    echo command returned true 
fi 

不過請注意,無論是那些關心什麼錯誤代碼是的。如果你知道你只關心特定的錯誤代碼,那麼你需要手動檢查$?

+2

@ deadcell4當程序出現故障時需要終止一個shell腳本,下面的習慣用法很有用:'a_command ||' return 1' – gboffi 2014-10-31 13:32:06

+1

@gboffi'return'只適用於函數和源腳本。你需要'退出'爲另一種情況(這在功能和源腳本中做得太多)。但是,是的,如果你不需要任何特定的清理或額外的輸出,這當然是一個合理的模式。 – 2014-10-31 13:33:49

+0

感謝您的糾正。起初我誤解了你的評論,但現在我看到它,**來源**腳本:-) – gboffi 2014-10-31 13:44:11

19

$?是一個像其他任何參數。在最終致電exit之前,您可以保存其使用價值。

exit_status=$? 
if [ $exit_status -eq 1 ]; then 
    echo "blah blah blah" 
fi 
exit $exit_status 
-1
tail /var/log/XXX.log | grep 'to be found' && echo found 
28

注意退出代碼!= 0用於報告錯誤。所以,這是更好地做:的

retVal=$? 
if [ ! $? -eq 0 ]; then 
    echo "Error" 
fi 
exit $retVal 

代替

# will fail for error codes > 1 
retVal=$? 
if [ $? -eq 1 ]; then 
    echo "Error" 
fi 
exit $retVal