Shell 腳本調試的主要工作是發現腳本的錯誤的原因,以及定位腳本中發生錯誤的行。Bash 提供了多種腳本調試的功能。但是比較常用的是使用 Bash 的 -x 選項啟動一個子 Shell,它將以調試模式運行整個腳本,使 Shell 在執行腳本的過程中把實際執行的每一個命令行顯示出來,并且在命令行的行首顯示一個 “+” 號,“+” 號后面顯示的是經過了參數擴展的命令行的內容。這將有助于分析實際執行的是什么命令。
Bash 的執行選項還可以在腳本中通過 let 命令來指定。“set -選項”表示啟動某選項,“set +選項”表示關閉某選項。所以我們可以在 Shell 腳本中使用 “set -x” 和 “set +x” 命令來調試腳本中的某一段代碼。
Bash 中還有一個 “-v” 選項,該選項將激活詳細輸出模式,在這一模式中,由 Bash 讀入的每一行命令都將在執行前被打印,包括注釋行。
定制輸出信息
$LINENO —— Bash 內部環境變量,表示 Shell 腳本的當前行號。
$FUNCNAME —— Bash 內部環境變量,它是一個包含了當前在執行調用堆棧中的所有 Shell 函數名稱的數組變量。${FUNCNAME[0]} 代表當前正在執行的 Shell 函數的名稱,${FUNCNAME[1]} 則代表調用函數
${FUNCNAME[0]} 的函數的名字,依次類推。
$PS4 —— Bash 內部環境變量,在使用 Bash 的 -x 選項時,每一條實際執行的命令的行首會顯示一個 “+” 號,這個 “+” 號其實就是變量 $PS4 的默認值。
利用 $PS4 變量,再結合 $LINENO 和 $FUNCNAME 兩個內部變量,通過重新定義變量 $PS4,可以增強 -x 選項的輸出信息。我們可以在執行腳本之前先執行下面的語句:
export PS4=`+{$LINENO:${FUNCNAME[0]}}`
使用示例:
Bash 中還有一個執行選項 -n,他可以用于測試 Shell 腳本中是否存在語法錯誤,它會讀取腳本中的命令行但是不會執行它們。
本文參考自 《Linux Shell命令行及腳本編程實例詳解 》