14 Shell脚本调试技术


14.1  Shell脚本中的常见错误
实际上,编写Shell脚本的过程就是不断排除错误的过程。尤其对于初学者来说,由于不熟悉Shell脚本的语法,会经常出现一些意想不到的错误。本节列出了Shell程序设计中经常出现的错误,从而使得读者在编程时可以避免这些错误的发生。

14.1.1  常见语法错误
在进行Shell程序设计的时候,语法错误经常出现在关键字书写错误,引号错误,漏掉空格符以及变量的大小写问题等。

#! /bin/bash
n=1
while [ $n -le 5  ];
do
    #注意do/done的配对
   echo "the numberis $n."
   let "n+=1"
done

#! /bin/bash

while :
do
   read x
    #注意if语句中的空格
   if [ $x == "exit" ]; then
      exit 0
   else
      echo "$x"
   fi
done

14.1.2  常见逻辑错误
通常情况下,Shell脚本中的语法错误是非常明显的,并且语法错误一般会导致程序不可执行。但是逻辑错误却比较隐蔽,因为这些错误通常不会引起程序执行失败,但是逻辑错误却会导致程序得到错误的结果。因此,相比语法错误,逻辑错误调试起来会更加困难。

#! /bin/bash

x=1
if [ x == 1  ]; then
   echo "x=1"
elif [ x == 0  ]; then
   echo "x=0"
else
   echo "other"
fi
#应该使用$x来引用变量

14.2  Shell脚本调试技术
任何一个Shell开发者,都必须掌握所需要的调试技术,对于初学者来说,这显得尤为重要。因为在编写Shell脚本的时候,经常会遇到各种各样的错误,通过调试技术,可以快速地排除错误。本节将介绍Shell编程中经常使用的几种调试技术。

14.2.1  使用echo命令调试脚本
echo命令是Shell编程中最简单的调试技术。当用户需要验证程序中某个变量的值时,就可以直接使用echo命令将该变量的值输出到屏幕。

#! /bin/bash
a=1
if [ "$a" -eq 1  ]
then
   b=2
else
   b=1
fi
c=3
echo "a=$a"
echo "b=$b"
echo "c=$c"

14.2.2  使用trap命令调试Shell脚本
在Shell脚本执行的时候,会产生3个所谓的伪信号,分别为EXIT、ERR以及DEBUG。其中,EXIT信号在退出某个函数或者某个脚本执行完成时触发,ERR信号在某条命令返回非0状态时触发,DEBUG信号在脚本的每一条命令执行之前触发。
#! /bin/bash
ERRTRAP()
{
   echo "[LINE:$1] Error:Command or function exited with status code $?"
}
func()
{
   return 1
}
trap 'ERRTRAP $LINENO' ERR
abc
func

#! /bin/bash
trap 'echo "before execute line: $LINENO, a=$a, b=$b, c=$c"' DEBUG
a=1
if [ "$a" -eq 1  ]
then
   b=2
else
   b=1
fi
c=3
echo "end"

14.2.3  使用tee命令调试Shell脚本
由于在实际开发过程中,管道和重定向在Shell脚本中使用得非常多。所以必须找到能够输出中间结果的方法。在这种情况下,tee命令就可以轻松地完成任务。tee命令会从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件。

#! /bin/bash
list=`ls -l | tee list.txt | awk '{print toupper($9)}'`
echo "$list"

14.2.4  使用调试钩子调试Shell脚本
在许多程序设计语言中,用户在调试程序的时候都可以设定一个开关变量,当该变量的值为真时,才输出调试信息;否则,不输出调试信息。例如用户可以设计以下代码:
if [ "$DEBUG" = "true"  ]; then
   输出调试信息
fi
只有当变量DEBUG的值为true时,才输出调试信息。这样的代码块称为调试钩子。

#! /bin/bash
export DEBUG=true
DEBUG()
{
   if [ "$DEBUG" == "true"  ];then
      $@
   fi
}
a=1
DEBUG echo "a=$a"
if [ "$a" -eq 1  ]
then
     b=2
else
     b=1
fi
DEBUG echo "b=$b"
c=3
DEBUG echo "c=$c"

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值