shell脚本调试之工具——bashdb

bash是Unix/Linux操作系统最常用的shell之一,它非常灵活,和awk、c++配合起来异常强大


以下使用一个测试脚本来说明使用bash调试的方法
test.sh

  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`  
  11.         echo $loaddate  
  12. done  
  13.   
  14. 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处设置断点           #########经验证,bashdb的break设置断点命令必须s、s、c然后到这个断点以后,还得从新设置下一个断点,否则不生效,===>即再次s、s、c才行###########################
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

posted @ 2015-12-02 04:59  arun_yh  阅读(2122)  评论(0编辑  收藏