Shell脚本调试技巧

  • Post author:
  • Post category:其他


脚本调试的主要工作就是发现引发脚本错误的原因以及脚本源代码中定位错误行,归纳汇总了SHELL脚本的总总方法,供大家学习参考。

方式一: 通过echo方式

【功能】: 最简单的调试方法,可以在任何怀疑出错的地方用echo打印变量

【场合】: 所有怀疑可能有问题的地方,省略了所有

【示例】:

echo $VAR

方式二: 通过选项方式[-ncxv]

-n

【功能】: 读取shell脚本,但不实际执行

【场合】: 用于测试Shell脚本中是否存在语法错误

【示例 】 : bash -n script.sh

-c

【功能】: 该选项使Shell解析器从字符串而非文件中读取并执行命令

【场合】: 当需要调试一小段脚本的执行结果时,非常方便

【示例 】 : bash -c ‘x=1;y=2;let z=x+y;echo “z=$z”’

-v

【功能】: 区别于-x参数,该选项打印命令行的原始内容,-x参数打印出经过替换后命令行的内容

【场合】: 仅想显示脚本的内容时

【示例 】 : bash -v script.sh

-x

【功能】: 提供跟踪执行信息,将执行脚本的过程中把实际执行的每个命令显示出来,行首显示+,+后面显示经过替换之后的命令行内容,有助于分析实际执行的是什么命令.

【场合】: 是调试Shell脚本的强有力工具,是Shell脚本首选的调试手段

【示例】:

在命令行提供参数:sh -x script.sh
脚本开头提供参数:#!/bin/sh -x
在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用

方式三: 通过test的方式

备注: 利用test方法可以检查逻辑操作符,文件状态,字符串,数值测试!返回值0为真,其他任何值为假

在这里插入图片描述

方式四: 通过trap来调试

【作用】: 用于捕获指定的信号并执行预定义的命令

【语法】: trap ‘command’ signal

【说明】: signal是要捕获的信号,command是捕获到指定的信号,所要执行的命令, 可以用kill -l命令看到系统中全部 可用的信号名,捕获信号后所执行的命令, 可以是一条或多条合法的Shell语句,也可以是一个函数名,Shell脚本执行时,会产生三个伪信号(非操作系统产生,而仅是shell本身产生,称之为伪信息),通过使用trap捕获这三个伪信号并输出信息对调试大有帮助

SHELL三个伪信号
EXIT               从一个函数中退出或整个执行完毕
ERR                 当一个命令执行不成功,返回非0状态时
DEBUG              脚本中每一条命令执行之前

【示例】:

在这里插入图片描述

调整后输出结果:

在这里插入图片描述

方式五: 使用调试工具-bashdb

【功能】: 类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能

【场合】: 脚本比较大时,通过-x参数调试时已不方便时.

【用法】:

bashdb -c script.sh
bashdb script.sh
bashdb --debugger script.sh

【说明】:该工具默认未安装,当前最新版本为:4.3-0.91,下载目录:http://bashdb.sourceforge.net/

1). 如果是ubuntu系统,直接用apt-get来安装

apt-get install bashdb

2). 如果是Readhat等版本,使用wget下载后,编译,安装,大致步骤如下:

wget https://sourceforge.net/projects/bashdb/files/bashdb/4.3-0.91/bashdb-4.3-0.91.tar.bz2
tar -xzvf bashdb-4.3-0.91.tar.bz2
cd bashdb-4.3-0.91
./configure
make && make install

【示例】:

在这里插入图片描述

【常用命令】

l             列出当前行以下的10行
q|quit        退出
h             帮助
/for/         向后搜索字符串for
?for?         向前搜索字符串for
x 1+2         计算算术表达式的值
!! ls -laRt   执行shell命令
n             执行下一条语句
s 4           单步执行4次,如遇到函数则进入函数里面
b 4           在行号4处设置断点
del 4         删除行号为4的断点
c 10          一直执行到行号10处   
R|run       重新执行当前调试脚本
finish        执行到程序最后

原文: https://blog.csdn.net/Jerry_1126/article/details/51526266