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

Bash 中還有一個執(zhí)行選項 -n,他可以用于測試 Shell 腳本中是否存在語法錯誤,它會讀取腳本中的命令行但是不會執(zhí)行它們。
本文參考自 《Linux Shell命令行及腳本編程實例詳解 》