﻿# 撰寫 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
```

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

**相關連結**

-   [Advanced Bash-Scripting Guide](http://tldp.org/LDP/abs/html/)
-   [Bash: Error handling](http://fvue.nl/wiki/Bash:_Error_handling)
