
我編寫了一個腳本來運行一些linux命令並捕獲if子句中的異常並輸出結果。基本上,下面程式碼摘錄中的每個變數都代表命令執行狀態,如果所有命令都成功執行,我希望成功退出腳本。否則我想退出。在測試腳本時,我故意使命令失敗,並且一個變數(例如 X8)的輸出為 1。它向我顯示成功訊息而不是腳本失敗訊息。不知道為什麼
if [ $X1 != 0 ] && [ $X2 != 0 ] && [ $X3 != 0 ] && [ $X4 != 0 ] && [ $X5 != 0 ] && [ $X6 != 0 ] && [ $X7 != 0 ] && [ $X8 != 0 ];
then echo "script failed"; exit 1;
else echo "success"; fi;
答案1
在腳本的頂部添加以下內容:
trap 'echo "Error $? at $LINENO; aborting." 1>&2; exit $?' ERR
然後,每當任何事情拋出未捕獲的錯誤時,腳本都會使用上述訊息進行退出,並使用錯誤的退出程式碼退出。如果您確實想對任何錯誤使用退出代碼 1,則可以變更$?
為。1
答案2
首先,您使用的[
是 的簡寫test
。從man test
:
STRING1 != STRING2 the strings are not equal
您使用了錯誤的工具來完成這項工作。你需要的是
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
其次,這裡有多個條件需要測試。不要使用冗長的 if 語句,而是嘗試將每個變數的輸出相加,如 Glenn 在註釋中建議的那樣,並進行測試。或者,在每個命令存在後立即對其輸出進行評估。如果您要退出,那麼執行其他命令是沒有意義的,因為無論如何該命令都會輸出。
這是一種循環方法:
for i in $X1 $X2 $X3 ;
do
[ $i -ne 0 ] && { echo "something failed"; exit 1; }
done
echo "Everything OK"
這裡的技巧是,您對每個變數進行相同的測試,如果測試失敗,腳本將永遠不會到達「一切正常」部分