您的位置:首页 > 运维架构 > Shell

14 Shell脚本调试技术

2015-03-13 14:47 309 查看
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"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: