3

Shell脚本的简单排错法及调试程序bashdb

 3 years ago
source link: https://zhang.ge/1517.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Shell脚本的简单排错法及调试程序bashdb

Jager · 2月19日 · 2014年bashdb · shell脚本 · 脚本debug 7497次已读

Jboss的研究稍有卡壳,那就来点基础教程好了。

与众多脚本语言一样,Shell脚本在执行时出错是很常见的,最简单的原因无外乎脚本在编写的过程中出现了语法错误或者不小心输错了命令等。找出脚本中的错误是很重要的能力。比如,我经常不小心会把echo命令写成了ehco,那么执行就会出现下面这种情况:

[root@localhost ~]# sh test
test: line 2: ehco: command not found

从报错信息很容易判断出错的原因是“命令不存在”。重新编辑这个文件修改成echo就可以解决。如果只是语法或命令上的错误还是比较容易辨别的,但往往一些逻辑或算法错误就不容易发现,因为语法正确且本身不会造成程序运行错误。比如说下面的脚本,本来想连续10次做某些操作的,结果却迟迟没输出。仔细观察一下就知道是陷入了死循环。

[root@localhost ~]# cat test
#!/bin/bash
for ((i=10;i>0;i=i+1))
#run command there

如果在上面的循环中加入echo语句,就容易发现问题了。而如果是单次循环过快,根本来不及看就进入了下一次循环,那这时就可以加入sleep命令降低单次循环的速度,比如使用sleep 2,单次循环就将延时2s,给我们带来足够的观察时间:

[root@localhost ~]# cat test
#!/bin/bash
for ((i=10;i>0;i=i+1))
#run command there
echo "i=$i";

为了更清晰的看到脚本运行的过程,我们还可以借助-x参数来观察脚本的运行情况。比如上面的脚本,我们使用-x参数执行就可以发现,变量i的值一直在增加,且一直满足x>0的条件,所以这是一个死循环。所以,我们只要将i=i+1修改成i=i-1即可。

[root@localhost ~]# sh -x test
+ (( i=10 ))
+ (( i>0 ))
+ echo i=10
+ sleep 2
+ (( i=i+1 ))
+ (( i>0 ))
+ echo i=11
+ sleep 2
+ (( i=i+1 ))
+ (( i>0 ))
+ echo i=12
+ sleep 2
[Ctrl +c]终止脚本

Shell本身并没有提供更好的排错工具,为了更加精细地调试Shell脚本,我们可以借助第三方工具bashdb。这是一个类似于GDB的脚本调试软件,小巧而强大,具有这只断点、单步执行、观察变量等功能。下载时请根据所使用的bash版本选择相应的bashdb,否则会提示因为版本不符合而无法安装。

如下查看bash版本:

[root@localhost ~]# bash --version
GNU bash, version 3.1.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

如下安装:

#第一步:在终端使用wget下载3.1版本
wget http://ftp.jaist.ac.jp/pub/sourceforge/b/ba/bashdb/bashdb/3.1-0.09/bashdb-3.1-0.09.tar.gz
#第二步:解压并进入目录
tar -zxvf bashdb-3.1-0.09.tar.gz
cd bashdb-3.1-0.09
#第三步:配置及编译安装
./configure
make && make install

安装完成后,我们便可以在终端使用bashdb命令了,改命令典型用法如下:

[root@localhost ~]# bashdb --debug 脚本名

常用参数:

一、列出代码和查询代码类:
l 列出当前行以下的10行
- 列出正在执行的代码行的前面10行
. 回到正在执行的代码行
w 列出正在执行的代码行前后的代码
/pat/ 向后搜索pat
?pat?向前搜索pat
二、Debug控制类:
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 条件断点

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK