shell 脚本调试技巧
1.使用dos2unix命令处理
使用dos2unix命令处理在Windows下开发的脚本
[root@zabbix ~]# man cat
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
2715529211[root@zabbix ~]# cat -v test.txt |head
1009781813^M
2829598589^M
1070069937^M
你可能会发现,对于在Windows下开发的脚本,明明经检查没有发现问题,但就是在执行时会出现莫名其妙的语法错误。
这时,最好执行dos2unix格式化一下。执行dos2unix格式化是一个很好的习惯。
[root@zabbix ~]# yum install -y dos2unix
[root@zabbix ~]# dos2unix test.txt
dos2unix: converting file test.txt to Unix format ...
[root@zabbix ~]# cat -v test.txt |head
1009781813
2829598589
1070069937 ====> ^M没有了,回归正常
2. 利用echo调试一个简单的判断脚本
[root@zabbix scripts]# cat com_if.sh
#!/bin/bash
read -p "pls input two nums:" num1 num2
a=$num1
b=$num2
echo $a $b ==> 增加打印输出,确认变量值是否符合要求
exit ==> 退出脚本,目的是不执行后面的代码
## no.1 -- check num of args
if [ -z "$a" -o -z "$b" ] ;then
echo "USAGE: sh "$0" num1 num2"
exit 1
fi
3. 使用bash命令参数调试
最重量级的方法bash或sh的参数调试方法
sh [-nvx] script.sh
[root@zabbix scripts]# set |grep PS[1-9]
PS1='[u@h W]$ '
PS2='> '
PS4='+${LINENO}'
[root@zabbix scripts]# export PS4='+${LINENO}' === -x参数调试时,设置PS4可以增加行号
[root@zabbix scripts]# sh -x check_web.sh
参数说明如下。
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示。
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示。
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。推荐使用
4. 使用set命令调试部分脚本内容
set命令也可以用于辅助脚本调试。以下是set命令常用的调试选项。
set -n:读命令但并不执行。
set -v:显示读取的所有行。
set -x:显示所有命令及其参数。
提示:通过set -x命令开启调试功能,而通过set +x关闭调试功能。
[root@zabbix 0511]# cat for_nn.sh
#!/bin/bash
COLOR='e[47;30m'
RES='e[0m'
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
if [ `echo $((${j}*${i}))` -le 9 ];then
echo -en "${COLOR}${j}x${i}=$((${j}*${i})) ${RES} "
else
set -x ==>调试开始的地方
echo -en "${COLOR}${j}x${i}=$((${j}*${i}))${RES} "
set +x ===> 调试结束的地方
fi
done
echo
done
[root@zabbix 0511]# sh for_nn.sh
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 + echo -en 'e[47;30m3x4=12e[0m '
3x4=12 + set +x
+ echo -en 'e[47;30m4x4=16e[0m '
4x4=16 + set +x
...
提示:加了set -x,在运行脚本的时候,就不需要使用sh -x了。
5. 其他调试Shell脚本的工具
(1)Shell调试工具:
bashdbShell调试器bashdb是一个类似于GDB的调试工具,可以完成对Shell脚本的断点设置、单步执行、变量观察等许多功能,但是很少使用。
(2)Shell调试工具:
shellcheckshellcheck是一个可检查sh/bash脚本和命令语法的小工具,地址为:http://www.shellcheck.net/,也很少使用。
小结:
1)要记得首先用dos2unix对脚本(从其他地方拿来用的)进行格式化。
2)执行脚本根据报错来调试时,要知道有时所报错误会不准确,应多关联上下文查看。
3)可通过sh -x命令调试整个脚本,且显示执行过程。
4)set -x和set +x命令用于调试部分脚本的执行过程(可在脚本中设置)。
5)可通过echo命令输出脚本中要确认的变量及相关内容,然后紧跟着使用exit退出,
不执行后面程序,这种方式便于一步步跟踪脚本,对于逻辑错误的调试比较好用。写法即“echo $var;exit”
6)最关键的还是要语法熟练,养成良好的编码习惯,提高编程思想,将错误扼杀在萌芽状态之中,
从而降低错误率,减轻调试的负担,提高开发效率。