Bash 指令碼中的錯誤處理

夢共裡醉發表於2022-09-07
本文講述了在 Bash  中處理錯誤的一些技巧,如何獲取錯誤程式碼、在執行 時獲得詳細輸出、處理除錯功能和錯誤重定向。使用這些技巧,系統管理員可以使他們的日常工作變得輕鬆。
退出狀態

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

如下是一個簡單例子:

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

如果執行上述指令碼一次,它將列印 0,因為該目錄不存在,因此指令碼將建立它。如果第二次執行該指令碼,將獲得一個非零值,如下所示:

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

Bash 指令碼中的錯誤處理Bash 指令碼中的錯誤處理

最佳實踐

建議透過將  set -x  新增到   指令碼來啟用除錯模式,如下所示:

[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

Bash 指令碼中的錯誤處理Bash 指令碼中的錯誤處理
可以編寫如下除錯函式,這有助於隨時呼叫它,使用以下示例:

[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=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5

Bash 指令碼中的錯誤處理Bash 指令碼中的錯誤處理

錯誤重定向

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

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

Bash 指令碼中的錯誤處理Bash 指令碼中的錯誤處理
大多數時候,很難在指令碼中找到確切的行號。要列印帶有錯誤的行號,請使用  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

Bash 指令碼中的錯誤處理Bash 指令碼中的錯誤處理

總結

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524109/viewspace-2913716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章