十三、脚本调试

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
完美

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值