Shell脚本调试方法

Shell脚本的调试有很多命令和工具都支持,我们可以按自己的实际需要和具体场景来选择。

使用-x选项

-x选项可以在执行每一条命令之前,将命令和参数打印到终端。这样可以跟踪脚本,比如

#!/bin/bash
echo "Hello,World!"

或者在调用脚本时使用

sh -x script.sh

使用-v选项

-v选项会在执行脚本时显示所有的行,激活详细模式。例如:

sh -v script.sh

使用-n选项

-n选项会读取所有命令但不执行他们,用于语法检查。例如:

sh -n script.sh

使用set命令

set命令可以在脚本的特定部分启用或禁用调试模式。例如:

#!/bin/bash
set -x
echo "This will be debugged"
set +x
echo "This will not be debugged"

使用trap命令

trap命令可以捕获指定的信号并执行预定义的命令。例如:

#!/bin/bash
trap 'echo "Executing line: $LINENO"' DEBUG
echo "Hello"
echo "World"

使用bashdb来做调试

环境准备

这里先可以通过bash --version命令来看一下我们的机器上bash版本是哪个,现阶段的Linux服务器上大部分还是再4.x和5.x版本。
比如下面这个服务器上bash版本为4.2


image.png

这个服务器上bash版本为5.2


image.png

根据你自己的服务器环境,找到一个匹配的包就可以了,可以到如下地址去找,通常要求bash和bashdb的大版本至少要一样的,也就是4.x的bash只能和4.x的bashdb配合使用,5.x的bash版本只能和5.x的bashdab配合使用。
最终是不是能匹配使用上在安装配置的时候会给出提示的,这里我们在下面这个地址去找合适的安装包就可以了:

https://sourceforge.net/projects/bashdb/files/bashdb/

当然也可以直接用 wget命令下载也是一样的

#下载4.2-0.92版本
wget https://sourceforge.net/projects/bashdb/files/bashdb/4.2-0.92/bashdb-4.4-0.92.tar.gz

#下载5.0-1.1.2版本
wget https://sourceforge.net/projects/bashdb/files/bashdb/5.0-1.1.2/bashdb-5.0-1.1.2.tar.gz

下载完成后,就是通过tar -zxvf解压,然后到解压后的目录里面去执行./configue配置,然后再make && make install这一套通用的linux上通过源码安装软件的操作了。
这里注意我们在执行./configue的时候如果版本匹配不上会有提示的,比如下面这个,提示我们bashdb是5.0的,要求bash版本也要是5.0才可以:


image.png

我们可以去升级bash,同样也可以换一个bashdb版本,就像前文说的两个版本能匹配上了就可以用。
bash的下载地址可以到

http://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz

去下载
这里以bash-5.0版本为例子,执行

wget http://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz

获取安装包,然后解压安装依赖

tar -zxvf bash-5.0.tar.gz -C  /home/shell/
#没有安装gcc的话安装,如果服务器环境一家有了的话忽略这一步
yum -y install gcc make

然后进入目录编译安装

./configure && make && make install

然后我们需要通过软链接重新定义/bin/bash命令的指向,这样执行bash就会用到我们安装的版本

mv /bin/bash /bin/bash.bak
ln -s /home/shell/bin/bash /bin/bash

最后执行命令bash --version查看一下版本信息是不是已经更新过来了

调试参数

上一步安装完成后,我们就可以使用bashdb --debug命令来调试脚本了
这里需要了解一下调试的常用的参数,如下:

l  列出当前行以下的10行
-  列出正在执行的代码行的前面10行
.  回到正在执行的代码行
/pat/ 向后搜索pat
?pat?向前搜索pat
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 条件断点
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容