[Linux] shell脚本错误检测

除了 echo 命令,还可以使用如下两种方法。

1.shell跟踪选项

set命令执行之后的每一条命令以及加在命令行中的任何参数(包括变量和变量的值)都会显示出来。"+"是跟踪输出的标志,在子shell中执行的shell命令会加两个"+"。

【例】

#!/bin/sh
#set -x
echo -n "Can you write device drivers?"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
if [ "$answer" = "Y" ]
then
    echo "Wow, you must be very skilled"
else
    echo "Neither can I, I'm just an example shell script"
fi

说明:
1.read命令参考 https://www.cnblogs.com/anay/p/8973510.html#_label0
2.echo $answer | tr [a-z] [A-Z]  将变量answer中的小写字母全部转换成大写字母 
3.注意判断式 if [ "$answer" = "Y" ] 的比较操作符两边都要有空格

运行该文件时,示例结果如下
$ ./example
Can you write device drivers? y
Wow, you must be very skilled

或者
$ ./example
Can you write device drivers? n
Neither can I, Im just an example shell script

如果"set -x"那一行没有注释掉,则运行结果如下所示:
$ ./example

+ echo -n 'Can you write device drivers?'
Can you write device drivers?+ read answer
y
++ echo y
++ tr '[a-z]' '[A-Z]'
+ answer=Y
+ '[' Y = Y ']'
+ echo 'Wow, you must be very skilled'
Wow, you must be very skilled

或如下所示:

+ echo -n 'Can you write device drivers?'
Can you write device drivers?+ read answer
n
++ echo n
++ tr '[a-z]' '[A-Z]'
+ answer=N
+ '[' N = Y ']'
+ echo 'Neither can I, I'\''m just an example shell script'
Neither can I, I'm just an example shell script

2.根据调试层次控制输出

在脚本的开始部分设置一个调试变量。脚本运行时测试该变量,然后根据变量的值决定是显示还是禁止调试指令。

# !/bin/sh
debug=1
test $debug -gt 0 && echo "Debug is on"
echo -n "Can you write device drivers?"
read answer
test $debug -gt 0 && echo "The answer is $answer"
answer=`echo $answer | tr [a-z] [A-Z]`
if [ "$answer" = "Y" ]
then
    echo "Wow, you must be very skilled"
    test $debug -gt 0 && echo "The answer is $answer"
else
    echo "Neither can I, I'm just an example shell script"
    test $debug -gt 0 && echo "The answer is $answer"
fi

说明:

test $debug -gt 0 && echo some_debug_output  只有test结果为真,测试条件逻辑与才会执行其它代码
test $debug -gt 0 || echo some_debug_output  只有test结果为假,测试条件逻辑或才会执行其它代码

参考资料:《shell脚本专家指南》 [美] Ron Peters 著

发布了89 篇原创文章 · 获赞 1 · 访问量 4830

猜你喜欢

转载自blog.csdn.net/wy_hhxx/article/details/103866486