The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

撰寫 Bash script 需考慮錯誤處理情況 (利用 $? 特殊參數)

我們最近有台 Linux 發生一些異常情況,導致硬碟幾乎快被 Log 填滿了,仔細分析之後才發現原來是因為我們之前寫的一支 Bash Script 並沒有正常執行,導致作業無法完成,所以有一段時間沒有做 Log 壓縮的處理。

我舉一個簡單的例子,若我要將檔案先搬移到另一個目錄,然後再將新檔建立起來,應該會用以下指令:

mv some.log $BAKDIR/some-$TODAY.log
gzip -9 $BAKDIR/some-$TODAY.log

不過第一行指令可能會因為檔案被鎖定而造成檔案無法搬移,所以第二行也跟著失敗,若接下來還有一連串的指令都是相關的,可能都會連帶失敗。這樣的情況下,也有可能會造成垃圾檔案存在,或導致整個 script 永遠無法正常執行。

在 Bash 中,判斷上一個指令是否執行成功,可以利用 $? 這個特殊參數,這個特殊刪除所儲存的值正式「上一個指令」所回傳的執行狀態 ( 型態是整數值 ),如果你上一個指令也是一個 Bash script 的話,可以透過 Bash 中的 exit 指令回傳狀態。

只要 $? 這個特殊參數的值是 0 就代表上一個指令「成功執行」,若不等於 0 則代表有問題發生,這時你就可以進行適當的錯誤處理(Error Handling)。

以下是一個簡單的錯誤處理範例:

SUCCESS=0

mv some.log $BAKDIR/some-$TODAY.log

if [ "$?" -ne $SUCCESS ]
then
        echo "Can NOT move some.log to $BAKDIR/some-$TODAY.log!!"
        exit 1
fi

透過這個方式,才能確保程式可以完整且正確的執行所有工作!

相關連結