1. 程式人生 > >如何除錯Shell指令碼

如何除錯Shell指令碼

1) 檢查語法錯誤:
一般來說我們可以通過修改shell指令碼的原始碼,令其輸出相關的除錯資訊來定位錯誤,那有沒有不修改原始碼來除錯shell指令碼的方法呢?答案就是使用shell的執行選,下面是一些常用選項的用法:
-n 只讀取shell指令碼,但不實際執行
-x 進入跟蹤方式,顯示所執行的每一條命令
-c "string" 從strings中讀取命令

“-n”可用於測試shell指令碼是否存在語法錯誤,但不會實際執行命令。在shell指令碼編寫完成之後,實際執行之前,首先使用“-n”選項來測試指令碼是否存在語法錯誤是一個很好的習慣。因為某些shell指令碼在執行時會對系統環境產生影響,比如生成或移動檔案等,如果在實際執行才發現語法錯誤,您不得不手工做一些系統環境的恢復工作才能繼續測試這個指令碼。

“-c”選項使shell直譯器從一個字串中而不是從一個檔案中讀取並執行shell命令。當需要臨時測試一小段指令碼的執行結果時,可以使用這個選項,如下所示:
sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'

"-x"選項可用來跟蹤指令碼的執行,是除錯shell指令碼的強有力工具。“-x”選項使shell在執行指令碼的過程中把它實際執行的每一個命令列顯示出來,並且在行首顯示一個"+"號。 "+"號後面顯示的是經過了變數替換之後的命令列的內容,有助於分析實際執行的是什麼命令。 “-x”選項使用起來簡單方便,可以輕鬆對付大多數的shell除錯任務,應把其當作首選的除錯手段。

2) 除錯工具-bashdb
使用shell偵錯程式bashdb,這是一個類似於GDB的除錯工具,可以完成對shell指令碼的斷點設定,單步執行,變數觀察等許多功能。

使用bashdb進行debug的常用命令
1.列出程式碼和查詢程式碼類:
l   列出當前行以下的10行
-   列出正在執行的程式碼行的前面10行
.   回到正在執行的程式碼行
w  列出正在執行的程式碼行前後的程式碼
/pat/  向後搜尋pat
?pat?向前搜尋pat

2.Debug控制類:
h  幫助
help 命令  得到命令的具體資訊
q  退出bashdb
x 算數表示式  計算算數表示式的值,並顯示出來
!!空格Shell命令 引數  執行shell命令
使用bashdb進行debug的常用命令(cont.)
控制指令碼執行類:
n   執行下一條語句,遇到函式,不進入函式裡面執行,將函式當作黑盒
s n  單步執行n次,遇到函式進入函式裡面
b 行號n  在行號n處設定斷點
del 行號n 撤銷行號n處的斷點
c 行號n 一直執行到行號n處
R  重新啟動
Finish 執行到程式最後
cond n expr 條件斷點