13.1 Shell脚本中的常见错误
实际上,编写Shell脚本的过程就是不断排除错误的过程。尤其对于初学者来说,由于不熟悉Shell脚本的语法,会经常出现一些意想不到的错误。本节列出了Shell程序设计中经常出现的错误,从而使得读者在编程时可以避免这些错误的发生。
13.1.1 常见语法错误
在进行Shell程序设计的时候,语法错误经常出现在关键字书写错误,引号错误,漏掉空格符以及变量的大小写问题等。
// if 条件语句缺少结尾关键字引起的错误
[root@kittod ~]# cat 1301.sh
#!/bin/bash
if [ 10 -lt 12 ]
then
echo "Yes,10 id less then 12"
[root@kittod ~]# bash 1301.sh
1301.sh: line 6: syntax error: unexpected end of file
// 循环结构语句中缺少关键字引起的错误
for,while,until 和 case 语句中的错误是指实际语句段不正确, 也许是漏写或拼错了固
定结构中的一个保留字。
[root@kittod ~]# cat 1302.sh
#!/bin/bash
n=1
while [ $n -le 5 ]
echo "the number is $n."
let "n+=1"
done
[root@kittod ~]# bash 1302.sh
1302.sh: line 7: syntax error near unexpected token `done'
1302.sh: line 7: `done'
// 成对的符弓有 []、()、 {}、 "" 、''、``等, 如果它们落了单, 也会导致一些错误
[root@kittod ~]# cat 1303.sh
#!/bin/bash
while :
do
read x
if [ $x == "exit"];then
exit 0
else
echo "$x"
fi
done
[root@kittod ~]# bash 1303.sh
3
1303.sh: line 6: [: missing `]'
3
13.1.2 常见逻辑错误
通常情况下,Shell脚本中的语法错误是非常明显的,并且语法错误一般会导致程序不可执行。但是逻辑错误却比较隐蔽,因为这些错误通常不会引起程序执行失败,但是逻辑错误却会导致程序得到错误的结果。因此,相比语法错误,逻辑错误调试起来会更加困难。
[root@localhost ~]# cat 10_4.sh
#! /bin/bash
x=1
if [ x == 1 ] #应该是$x
then
echo "x=1"
elif [ x == 0 ] #应该是$x
then
echo "x=0"
else
echo "other"
fi
[root@localhost ~]# sh 10_4.sh
other
13.2 Shell脚本调试技术
任何一个Shell开发者,都必须掌握所需要的调试技术,对于初学者来说,这显得尤为重要。因为在编写Shell脚本的时候,经常会遇到各种各样的错误,通过调试技术,可以快速地排除错误。本节将介绍Shell编程中经常使用的几种调试技术。
1、使用dos2unix命令处理在windows下开发的脚本
2、使用echo命令调试
echo命令是最有用的调试脚本的工具之一。一般应在可能出现的问题的脚本重要的部分加入
echo命令(在变量读取或修改操作的前后加入echo命令,并紧挨着退出命令exit)。此调试
方法不仅适用于shell,在php、Python语言中经常使用。
3、使用bash命令参数调试
[root@ks ~]# sh [-nvx] nginx.sh
参数说明:
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本。如果有错误,也会给出错误
提示。
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。
注:参数-x是追踪脚本执行过程一种非常好的方法,他可以在执行前列出所执行的所有程序
段。
如果是程序段落,在输出时,最前面会加上+符号,表示程序代码。
如果执行脚本发生问题(非语法问题时),利用-x参数,就可以知道问题出在哪一行
一般情况下如果是调试逻辑错误的脚本,用-x的参数效果更佳。
缺点:加载系统函数库等很多我们不想查看其整个过程的脚本时,会有太多输出,导致很难查看所需要的内容。
4、使用set命令调试部分脚本内容
set 命令也可以用于辅助脚本调试。
set命令常用的调试选项:
set -n :读取命令但并不执行
set -v :显示读取的所有行
set -x :显示所有命令及其参数
提示:通过set -x 命令开启调试功能,而通过set +x 关闭调试功能。
set命令最大优点是,和bash -x相比,set -x可以缩小调试的作用域。
[root@kittod ~]# cat debug.sh
#!/bin/bash
read -p "please input two number:" a b
set -x #开启调试
if (($a < $b))
then
echo "$a<$b"
elif (($a == $b))
then
echo "$a=$b"
else
echo "$a>$b"
fi
set +x #结束调试,只针对set -x 和set +x 之间的脚本进行调试
echo "完美"
[root@kittod ~]# bash debug.sh
please input two number:3 5
+ (( 3 < 5 ))
+ echo '3<5'
3<5
+ set +x
完美