shell脚本调试之工具——bashdb

摘要:
I++))do loaddate=`date-d“-$I天”+%Y-%m-%d`echo$loaddate done echo“------------------end------------------”1。使用bash-xbash-x在脚本执行期间打印所有语句,如:

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

免责声明:文章转载自《shell脚本调试之工具——bashdb》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot2.0+SpringCloud Eureka搭建高可用注册中心(Eureka之二)Js 跨域之李代桃僵下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

bash 的环境配置文件

http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的...

jquery js 动态加载 js文件

jquery方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xh...

Linux运维之shell脚本

一、bash漏洞 1)bash漏洞 bash漏洞是控制Linux计算机命令提示符的软件中存在的漏洞。 bash是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell ,Bourne shell是一个早期的重要shell, 由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。 网络安...

gdb 调试

昨天下班之间请教师父一个panic的解法,见他用gdb调试,真的很厉害,看到堆栈的东西,跟踪堆栈,定位报错的panic出错的具体汇编语句,很惊吓,感叹自己也是用gdb很久的人了,他的很多用法还不知道,特补充下vmlinux和gdb的相关知识在此作为笔记。 (gdb)list *0xc33310a0 (查看0xc33310a0地址所在的源代码段,常用来查看报...

windows2016server激活

首先百度的密钥如下: Windows Server 2016 数据中心Datacenter: CB7KF-BWN84-R7R2Y-793K2-8XDDG Windows Server 2016 标准版Standard:WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY Windows Server 2016 嵌入式版:JCKRF-N37P4-C2D...

谈谈EF Core实现数据库迁移

        作为程序员,在日常开发中,记忆犹新的莫过于写代码,升级程序。升级程序包含两部分:一是,对服务程序更新;二是,对数据库结构更新。本篇博文主要介绍数据库结构更新,在对数据库升级时,不知道园友们是否有如下经历:         1)脚本文件中建表语句未作判断是否存在,而导致执行失败。         2)脚本文件中修改字段在建表语句之前,关联存储...