shell 腳本(如果條件未如預期運作)

shell 腳本(如果條件未如預期運作)

我編寫了一個腳本來運行一些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"

這裡的技巧是,您對每個變數進行相同的測試,如果測試失敗,腳本將永遠不會到達「一切正常」部分

相關內容