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"
实际上,编写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"