Bash 腳本中的錯誤處理

本文講述了在 Bash 腳本中處理錯誤的一些技巧,如何獲取錯誤代碼、在執行腳本時獲得詳細輸出、處理調試功能和錯誤重定向。使用這些技巧,系統管理員可以使他們的日常工作變得輕鬆。

退出狀態

在 Bash 腳本中,$?將打印退出狀態。如果返回零,則表示沒有錯誤。如果不爲零,結論就是任務可能存在一些問題。

如下是一個簡單例子:

[root@localhost ~]# cat myscript.sh 
#!/bin/bash
mkdir learning
echo $?

如果運行上述腳本一次,它將打印 0,因爲該目錄不存在,因此腳本將創建它。如果第二次運行該腳本,將獲得一個非零值,如下所示:

[root@localhost ~]# sh myscript.sh 
0
[root@localhost ~]# sh myscript.sh 
mkdir: cannot create directory ‘learning’: File exists
1

最佳實踐

建議通過將 set -x 命令添加到 shell 腳本來啓用調試模式,如下所示:

[root@localhost ~]# cat test3.sh 
#!/bin/bash
set -x
echo "Hello World!"
mkdiir testing

然後運行腳本查看:

[root@localhost ~]# sh test3.sh echo 'Hello World!'
Hello World!
+ mkdiir testing
test3.sh: line 4: mkdiir: command not found

可以編寫如下調試函數,這有助於隨時調用它,使用以下示例:

[root@localhost ~]# cat debug.sh 
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@
}
DEBUG echo 'Testing Debugging'
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x

輸出內容如下:

[root@localhost ~]# sh debug.sh 
Testing Debugging
+ a=2b=3c=5
+ DEBUG set +x
+ '[' on == on ']'set +x
2 + 3 = 5

錯誤重定向

可以使用標準錯誤輸出將所有系統錯誤重定向到自定義文件,標準錯誤可以用數字 2 表示。在 Bash shell 執行它,如下所示:

[root@localhost ~]# mkdir users 2> errors.txt
[root@localhost ~]# cat errors.txt 
mkdir: cannot create directory ‘users’: File exists

大多數時候,很難在腳本中找到確切的行號。要打印帶有錯誤的行號,請使用 PS4 選項,其中的$LINENO是預定義好的變量。

[root@localhost ~]# cat test3.sh 
#!/bin/bash
PS4='$LINENO: '

set -x
echo "Hello World!"
mkdiir testing

可以在閱讀錯誤時輕鬆查看行號:

[root@localhost ~]# sh test3.sh 
5: echo 'Hello World!'
Hello World!
6: mkdiir testing
test3.sh: line 6: mkdiir: command not found

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DskoKquq0Kgv4yR1LVotiA