bash脚本测试总结
bash脚本测试总结
?
跟踪脚本的执行
可以让bash打印出你脚本执行的过程中的所有语句。这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下。
?
下面的这段脚本,先是输出一个问候语句,然后输出当前的时间:
#!/bin/bash
echo "Hello $USER,"
echo "Today is $(date +‘%Y-%m-%d‘)"
?
下面让我们使用-x选项来运行这段脚本:
$
?bash -x example_script.sh
+ echo ‘Hello chenhao,‘
Hello chenhao,
++ date +%Y-%m-%d
+ echo ‘Today is 2009-08-31‘
Today is 2009-08-31
?
这时,我们可以看到,bash在运行前打印出了每一行命令。而且每行前面的+号表明了嵌套。
这样的输出可以让你看到命令执行的顺序并可以让你知道整个脚本的行为。
?
在跟踪里输出行号
在一个很大的脚本中,你会看到很多很多的执行跟踪的输出,阅读起来非常费劲,所以,你可以在每一行前加上文件的行号,这会非常有用。要做到这样,你只需要设置下面的环境变量:
export PS4=‘+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: ‘
让我们看看设置上了PS4这个环境变量后会是什么样的输出。
$
?bash -x example_script.sh
+example_script.sh:2:: echo ‘Hello chenhao,
++example_script.sh:3:: date +%Y-%m-%d
+example_script.sh:3:: echo ‘Today is 2009-08-31‘
Today is 2009-08-31
?
调试部份的脚本
有些时候,你并不想调试整个脚本,你只要调试其中的一部份。
那么,你可以在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就可以了。
如下面的脚本所示:
#!/bin/bash
echo "Hello $USER,"
set -x
echo "Today is $(date %Y-%m-%d)"
set +x
?
让我们看看运行起来是啥样?
$
?./example_script.sh
Hello chenhao,
++example_script.sh:4:: date +%Y-%m-%d
+example_script.sh:4:: echo ‘Today is 2009-08-31‘
Today is 2009-08-31
+example_script.sh:5:: set +x
?
注意:我们在运行脚本的时候,不需要使用bash -x了。
?
日志输出
跟踪日志有时候太多了,多得都受不了,而且,输出的内容很难阅读。
一般来说,我们很多时候只关心于条件表达式,变量值,或是函数调用,或是循环等。。在这种情况下,log一些感兴趣的特定的信息,可能会更好。
使用log前,我们先写一个函数:
_log() {
? if [ "$_DEBUG" == "true" ]; then
? ? echo 1>&2 "[email?protected]"
? fi
}
?
于是,你就可以在你的脚本中如下使用:
_log "Copying files..."
cp src/* dst/
?
我们可以看到,上面那个_log函数,需要检查一个_DEBUG 变量,只有这个变量是真,才会真正开发输出日志。这样,你就只需要控制这个开关,而不需要删除你的debug信息。
$ _DEBUG=true ./example_script.sh
?
?
?
BASH 的调试手段
Wen Pingbo?创作于 2015/06/06
?评论?
?打赏
平时在写 BASH 脚本时,总是会碰到让人抓狂的 BUG。和 C/C++ 这么丰富的调试工具相比,BASH 又有什么调试手段呢? 1?echo/print (普通技)打印一些变量,或者提示信息。这应该是一个通用的方法了。在 BASH 里,我们可以简单的用 echo,或者 print 来输出一些 log,或者加一些 loglevel 来过滤一些 log。这里贴一下我平常用的函数:
_loglevel=2
?
DIE() {
echo "Critical: $1" >&2
exit 1
}
?
INFO() {
[ $_loglevel -ge 2 ] && echo "INFO: $1" >&2
}
?
ERROR() {
[ $_loglevel -ge 1 ] && echo "ERROR: $1" >&2
}
这里的实现只是简单的加了一个 loglevel,其实可以把 log 输出到一个文件中,或者给 log 加上颜色。比如:
# add color
[ $_loglevel -ge 1 ] && echo -e " 33[31m ERROR: 33[0m $1" >&2
# redirect to file
[ $_loglevel -ge 1 ] && echo "ERROR: $1" > /var/log/xxx_log.$BASHPID
?
2?set -x (稀有技)-x(xtrace) 选项会导致 BASH 在执行命令之前,先把要执行的命令打印出来。这个选项对调试一些命令错误很有帮助。 有的时候,由于传进来的参数带有一些特殊字符,导致 BASH 解析时不是按照我们预想的进行。这个时候,把 -x 打开,就能在命令执行前,把扩展后的命令打印出来。比如基于前面写的函数:
set -x
INFO "this is a info log"
ERROR "this is a error log"
set +x
然后就可以看到如下输出:
+ INFO ‘this is a info log‘
+ ‘[‘ 2 -ge 2 ‘]‘
+ echo -e ‘ 33[32m INFO: 33[0m this is a info log‘
INFO: this is a info log
+ ERROR ‘this is a error log‘
+ ‘[‘ 2 -ge 1 ‘]‘
+ echo -e ‘ 33[33m ERR: 33[0m this is a error log‘
ERR: this is a error log
+ set +x
如果想全程打开 xtrace,可以在执行脚本的时候加? 3?trap/bashdb (史诗技)为了方便调试,BASH 也提供了陷阱机制。这跟之前介绍的两种方法高级不少。我们可以利用 trap 这个内置命令来指定各个 sigspec 应该执行的命令。trap 的具体用法如下:
trap [-lp] [[arg] sigspec ...]
sigspec 包括? 各个 signal 这里就不介绍了。EXIT 会在 shell 退出时执行指定的命令。若当前 shell 中有命令执行返回非零值,则会执行与 ERR 相关联的命令。而 RETURN 是针对? 比如,下面的脚本会在退出时,执行echo:
#!/bin/bash
?
trap "echo this is a exit echo" EXIT
?
echo "this is a normal echo"
或者,让脚本中命令出错时,把相应的命令打印出来:
#!/bin/bash
?
trap ‘echo $BASH_COMMAND return err‘ ERR
?
echo this is a normal test
UnknownCmd
这个脚本的输出如下:
this is a normal test
tt.sh: line 6: UnknownCmd: command not found
UnknownCmd return err
亦或者,让脚本的命令单步执行:
#!/bin/bash
?
trap ‘(read -p "[$0 : $LINENO] $BASH_COMMAND ?")‘ DEBUG
?
echo this is a test
?
i=0
while [ true ]
do
echo $i
((i++))
done
其输出如下:
[tt.sh : 5] echo this is a test ?
this is a test
[tt.sh : 7] i=0 ?
[tt.sh : 8] [ true ] ?
[tt.sh : 10] echo $i ?
0
[tt.sh : 11] ((i++)) ?
[tt.sh : 8] [ true ] ?
[tt.sh : 10] echo $i ?
1
[tt.sh : 11] ((i++)) ?
[tt.sh : 8] [ true ] ?
[tt.sh : 10] echo $i ?
2
[tt.sh : 11] ((i++)) ?
是不是有点意思了?其实有一个?bashdb?的开源项目,也是利用 trap 机制,模拟 gdb 做了一个 bash 脚本的调试器。它本身也是一个 bash 脚本。在加载要调试的脚本后,可以用和 gdb 类似的命令,甚至缩写也是一样的,大家可以尝试一下:) (上个月沉迷于 Diablo3,最后发现自己脸不行,悴!还是回来写点东西吧!) Read More:
Shell脚本测试总结
?
1. 脚本测试的苦难 2. 我们应该如何入手 3. 静态测试 && 动态测试 2) 代码走查
“-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。 “-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示: "-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。 2) 调试工具-bashdb 使用bashdb进行debug的常用命令 2.Debug控制类:
6. 脚本测试中遇到的问题和解决方案 2) If语句判断
4) 变量传播
问题二:
? 7) ssh 远程执行后台命令不靠谱 ? 8) 变量使用前使用unset清理 ? 7. shell 内置变量 2) $BASH_SOURCE 3) $BASH_LINENO 4) $PS4
?
================= End
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |