脚本调试的主要工作就是发现引发脚本错误的原因以及脚本源代码中定位错误行。归纳汇总了下,调试脚本时,我们可能会用到的几种方式,比如说:最简单的通过echo的方式,通过set -x的方式,比较高端一点的通过trap或bashdb工具来调试脚本。
【
方式一
】: 通过echo方式
功能
:
最简单的调试方法,可以在任何怀疑出错的地方用echo打印变量
场合
:
所有怀疑可能有问题的地方
示例
:
echo $VAR
【
方式二
】: 通过选项方式
功能:
读取shell脚本,但不实际执行
场合:
用于测试Shell脚本中是否存在语法错误
示例:
# bash -n script.sh
#!/bin/bash
foo()
{
echo "Shell bash function is called"
}
echo "|--start----"
foo
echo "|--end------"
功能:
该选项使Shell解析器从字符串而非文件中读取并执行命令
场合:
当需要调试一小段脚本的执行结果时,非常方便
示例:
# bash -c 'x=1;y=2;let z=x+y;echo "z=$z"'
功能:
区别于-x参数,该选项打印命令行的原始内容,-x参数打印出经过替换后命令行的内容
场合:
仅想显示命令行的原始内容
示例:
# bash -v script.sh
功能:
提供跟踪执行信息,将执行脚本的过程中把实际执行的每个命令显示出来,行首显示+,
+后面显示经过替换之后的命令行内容,有助于分析实际执行的是什么命令.
场合:
是调试Shell脚本的强有力工具,是Shell脚本首选的调试手段
示例:
1).在命令行提供参数:$ sh -x script.sh
2).脚本开头提供参数:#!/bin/sh -x
3).在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用
【
方式三
】: 通过test的方式,返回值为0为真,1表假
【
方式四
】: 通过trap来调试
作用:
用于捕获指定的信号并执行预定义的命令
语法:
trap `command` signal
说明:
signal是要捕获的信号,command是捕获到指定的信号,所要执行的命令, 可以用kill -l命令看到系统中全部可用的信号名,捕获信号后所执行的命令,可以是一条或多条合法的Shell语句,也可以是一个函数名, Shell脚本执行时,会产生三个伪信号(之所以称为伪信息,因这是shell自己产生,而非操作系统产生),通过使用trap 捕获这三个伪信号并输出信息对调试大有帮助
SHELL三个伪信号
EXIT 从一个函数中退出或整个执行完毕
ERR 当一个命令执行不成功,返回非0状态时
DEBUG 脚本中每一条命令执行之前
示例:
#!/bin/bash
errorTrap()
{
echo "[LINE:$1]Error: Command or function exited with status $?"
}
foo()
{
return 1;
}
trap 'errorTrap $LINENO' ERR
abc
foo
脚本输出:
[root@localhost:shell]# bash test.sh
test.sh: line 12: abc: command not found
[LINE:12]Error: Command or function exited with status 127
[LINE:9]Error: Command or function exited with status 1
【
方式五
】: 使用调试工具-bashdb
使用shell调试器bashdb,这是一个类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能
使用方法: bashdb -c script.sh 或者 bashdb script.sh 或者 bashdb --debug script.sh
关于bashdb调试的,请参考链接,这篇介绍的相对详细点: http://zhangge.net/1517.html
Linux
脚本
调试
前言ba
sh
自身特性-v-n-x-x的增强$
LIN
ENO$FUNCNAME$[PS4](https://blog.51cto.com/kusorz/1968827)功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
浏览器打开
set有三个选项,可以用于
脚本
的
调试
选项名称 简写 意义noexecn读取
脚本
中的命令,进行语法检查,但不执行这些命令xtracex在执行每个命令之前,将每个命令打印到标准输出(stdout)无c...从...中读取命令#!/bin/ba
sh
set -n #或者 set -o noexececho "Start executing this script..." #用于判断
脚本
是否执行...
浏览器打开
一般情况下,我们会在终端输入一个个命令,来执行操作,但是这种
方式
对于简单的操作还可以,对于稍微复杂一点的操作就不可行了,因此,可以使用
脚本
来保存一系列命令,供用户多次重复调用执行。
由于我们并不能保证写的
脚本
没有bug,因此需要对
脚本
进行
调试
,下面我们就来讲讲如何启用
脚本
调试
在讲解之前,先介绍写基本知识
一、
脚本
及
浏览器打开
-n,读一遍
脚本
中的命令但不执行,用于检查
脚本
中的语法错误
-v,一边执行
脚本
,一边将执行过的
脚本
命令打印到标准输出
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
具体的使用
方式
有三种:
在命令行中提供参数:
$
sh
-x
浏览器打开
-n,读一遍
脚本
中的命令但不执行,用于检查
脚本
中的语法错误。
-v,一边执行
脚本
,一边将执行过的
脚本
命令打印到标准输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
1.在命令行提供参数:$
sh
-x script.
sh
2.
脚本
开头提供参数:#!/bin/
sh
-x
浏览器打开
1.1.1.1改变ba
sh
的提示符实际上就是改变变量(C)
$HOME $PWD $PS1 KaTeX parse error: Expected group after '_' at position 52: &h
ell
ip;其赋值给
shell
变量的命令是_̲_____
Fold &h
ell
ip;
1.1.1.4不是
shell
具有的功能和特点是()
A:管道 B:输入输出重定向 C:执...
浏览器打开
我们在前面介绍的
调试
手段是通过修改
shell
脚本
的源代码,从其输出相关的
调试
信息来定位错误的,那有没有不修改源代码来
调试
shell
脚本
的方法呢?有的,那就是使用
shell
的执行选项,下面将介绍一些常用选项的用法:-n 只读取
shell
脚本
,但不实际执行-x 进入跟踪
方式
,显示所执行的每一条命令-c "string" 从strings中读取命令"-n"可用于测试
shell
脚本
是否存在语法错误,但不会...
浏览器打开