標籤:
bash是Unix/Linux作業系統最常用的shell之一,它非常靈活,和awk、c++配合起來異常強大
以下使用一個測試指令碼來說明使用bash調試的方法
test.sh
[plain] view plaincopy
- #!/bin/bash
-
- echo "----------------begin-----------------"
-
- awk ‘{sum+=1} END{print sum}‘ test.sh
-
- MAX=3
- for ((i = 0; i < MAX; i++))
- do
- loaddate=`date -d"-$i day" +%Y-%m-%d`
- echo $loaddate
- done
-
- echo "----------------end-----------------"
1. 使用bash -x
bash -x列印出指令碼執行過程中的所有語句
like:
$ bash -x test.sh
斷點
+ echo ----------------begin-----------------
----------------begin-----------------
+ awk ‘{sum+=1} END{print sum}‘ test.sh
14
+ MAX=3
+ (( i = 0 ))
+ (( i < MAX ))
++ date ‘-d-0 day‘ +%Y-%m-%d
+ loaddate=2013-03-05
+ echo 2013-03-05
2013-03-05
+ (( i++ ))
+ (( i < MAX ))
++ date ‘-d-1 day‘ +%Y-%m-%d
+ loaddate=2013-03-04
+ echo 2013-03-04
2013-03-04
+ (( i++ ))
+ (( i < MAX ))
++ date ‘-d-2 day‘ +%Y-%m-%d
+ loaddate=2013-03-03
+ echo 2013-03-03
2013-03-03
+ (( i++ ))
+ (( i < MAX ))
+ echo ----------------end-----------------
----------------end-----------------
配合上注釋,bash -x基本可以滿足日常80%的需求
2. set
有的時候,我們的指令碼非常複雜,使用bash -x得到的輸出太多,很難找到需要的資訊
set 可以進行局部調試,在需要調試的代碼之前加上“set -x”,需要調試的代碼之後加上“set +x”即可
like:
修改test.sh:
....
set -x
awk ‘{sum+=1} END{print sum}‘ test.sh
set +x
.....
運行:
----------------begin-----------------
+ awk ‘{sum+=1} END{print sum}‘ test.sh
16
+ set +x
2013-03-05
2013-03-04
2013-03-03
----------------end-----------------
3. 使用bash調試工具bashdb(Bash Debugger)
bashdb是一個類GDB的調試工具,使用GDB的同學使用bashdb基本無障礙
bashdb可以運行斷點設定、變數查看等常見調試操作
bashdb需要單獨安裝
使用如下:
$ bashdb --debug test.sh
bash debugger, bashdb, release 4.2-0.8
Copyright 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Rocky Bernstein
This is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
(/home/work/code/test.sh:3):
3: echo "----------------begin-----------------"
bashdb<0> n #下一步
----------------begin-----------------
(/home/work/code/test.sh:5):
5: awk ‘{sum+=1} END{print sum}‘ test.sh
bashdb<1> l #列出上下共10行代碼
1: #!/bin/bash
2:
3: echo "----------------begin-----------------"
4:
5: => awk ‘{sum+=1} END{print sum}‘ test.sh
6:
7: MAX=3
8: for ((i = 0; i < MAX; i++))
9: do
10: loaddate=`date -d"-$i day" +%Y-%m-%d`
bashdb<2> b 10 #第10行設定斷點
Breakpoint 1 set in file /home/work/code/test.sh, line 10.
bashdb<3> c #繼續運行
14
Breakpoint 1 hit (1 times).
(/home/work/code/test.sh:10):
10: loaddate=`date -d"-$i day" +%Y-%m-%d`
bashdb<4> print $i #列印變數值
0
14: echo "----------------end-----------------"
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 條件斷點
url:
http://blog.csdn.net/adaptiver/article/details/7054729
http://blog.csdn.net/yfkiss/article/details/8636758
shell指令碼調試之工具——bashdb