shell脚本的错误检测总结


shell脚本的错误检测多种方法总结


一、通过使用命令或选项,检测错误:

正常运行:

[root@ping ~]# cat case_one.sh
	#!/bin/sh
	echo -ne "确定清空回收站 y/n?\n:"
	read answer
	answer=`echo $answer | tr [a-z] [A-Z]`
	if [ $answer = Y ]
	then
		rm -rf /root/.local/share/Trash/files/*
		echo "回收站已清空!"
	else
		mv /root/.local/share/Trash/files/* /root/桌面/
		echo "回收站文件已恢复!"
	fi

运行结果:

[root@ping ~]# sh case_one.sh
确定清空回收站 y/n?
:y
回收站已清空!


案例一:运行时添加选项-x,冗余跟踪。

[root@ping ~]# cat case_one.sh
	#!/bin/sh
	echo -ne "确定清空回收站 y/n?\n:"
	read answer
	answer=`echo $answer | tr [a-z] [A-Z]`
	if [ $answer = Y ]
	then
		rm -rf /root/.local/share/Trash/files/*
		echo "回收站已清空!"
	else
		mv /root/.local/share/Trash/files/* /root/桌面/
		echo "回收站文件已恢复!"
	fi

运行结果:

[root@ping ~]# sh -x case_one.sh
	+ echo -ne '确定清空回收站 y/n?\n:'
	确定清空回收站 y/n?
	:+ read answer
	y
	++ echo y
	++ tr '[a-z]' '[A-Z]'
	+ answer=Y
	+ '[' Y = Y ']'
	+ rm -rf /root/.local/share/Trash/files/ss.2
	+ echo  '回收站已清空!'
	回收站已清空!

注释:每一条可执行脚本命令前都会有一个“+”,当一条命令出现子级命令时会出现两个,即“++”。


案例二:运行时添加选项-v,冗余模式。

[root@ping ~]# sh -v case_one.sh
#!/bin/sh
echo -ne "确定清空回收站 y/n?\n:"
确定清空回收站 y/n?
:read answer
y
answer=`echo $answer | tr [a-z] [A-Z]`
echo $answer | tr [a-z] [A-Z]
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
fi
回收站已清空!

注释:-v选项脚本运行时,会将脚本内容输出,略显冗余,但选项常用于检测逻辑错误和语法错误。


案例三:脚本中添加命令set -x/-v,启用冗余跟踪/冗余模式。

[root@ping ~]# cat case_one.sh 
#!/bin/sh
set -x
echo -ne "确定清空回收站 y/n?\n:"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
fi
[root@ping ~]# sh case_one.sh
	+ echo -ne '确定清空回收站 y/n?\n:'
	确定清空回收站 y/n?
	:+ read answer
	y
	++ echo y
	++ tr '[a-z]' '[A-Z]'
	+ answer=Y
	+ '[' Y = Y ']'
	+ rm -rf '/root/.local/share/Trash/files/*'
	+ echo '回收站已清空!'
	回收站已清空!

[root@ping ~]# cat case_one.sh 
#!/bin/sh
set -v
echo -ne "确定清空回收站 y/n?\n:"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
fi
[root@ping ~]# sh case_one.sh
echo -ne "确定清空回收站 y/n?\n:"
确定清空回收站 y/n?
:read answer
y
answer=`echo $answer | tr [a-z] [A-Z]`
echo $answer | tr [a-z] [A-Z]
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
fi
回收站已清空!

注意:通常shell脚本,使用英文书写相对较为专业。包括注释,输出结果等,但是很多时候却有难以避免情况,往往出现时错误也随之而来。错误常常在于符号的使用方面。以本例说:!,“”,状况较多,也是希望在写脚本时注意。


二、通过使用输出语句,检测错误:

[root@ping ~]# cat case_one.sh 
#!/bin/sh
echo -ne "确定清空回收站 y/n?\n:"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
echo "你的选择是:$answer"
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
	echo "你的选择是:$answer"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
	echo "你的选择是:$answer"
fi
[root@ping ~]# sh case_one.sh
确定清空回收站 y/n?
:y
你的选择是:Y
回收站已清空!
你的选择是:Y

注释:使用这种方式通常用于脚本代码规模较小情况下,规模较大时尽管效果明显,但过于冗杂,且不便于查找。


三、通过使用层次调试控制检测输出。

[root@ping ~]# cat case_one.sh 
#!/bin/sh
debug=3
test $debug -gt 0 && echo "Debug is on"
echo -ne "确定清空回收站 y/n?\n:"
read answer
test $debug -gt 1 && echo "你的选择是:$answer"
answer=`echo $answer | tr [a-z] [A-Z]`
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	echo "回收站已清空!"
	test $debug -gt 2 && echo "你的选择是:$answer"
else
	mv /root/.local/share/Trash/files/* /root/桌面/
	echo "回收站文件已恢复!"
	test $debug -gt 2 && echo "你的选择是:$answer"
fi
[root@ping ~]# sh case_one.sh
Debug is on
确定清空回收站 y/n?
:y
你的选择是:y
回收站已清空!
你的选择是:Y

注释:
1. 本例使用两个优点:一是通过定义变量从而调试检测层次,二是即使规模较大,便于缩减代码量。
2. 通过定义层次,便于定位检测点。
3. 通过修改debug检测值,灵活测试检测点。


四、通过函数简化错误检测,有效利用预定义变量$?。

[root@ping ~]# cat case_one.sh 
#!/bin/sh
alert(){
if [ $? -eq 0 ]
then
	continue
else	 
	echo "WARNING:这条命令未执行成功!"
fi
}
echo -ne "确定清空回收站 y/n?\n:"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
alert
if [ $answer = Y ] 
then
	rm -rf /root/.local/share/Trash/files/*
	alert
	echo "回收站已清空!"
else
	mv /root/.local/share/Trash/files/* /root/桌面/ &> /dev/null
	alert
	echo "回收站文件已恢复!"
fi
[root@ping ~]# sh case_one.sh
确定清空回收站 y/n?
:y
回收站已清空!

[root@ping ~]# sh case_one.sh
确定清空回收站 y/n?
:n
WARNING:这条命令未执行成功!

注释:$?:程序退出后状态值,0表示正常,其他值异常。


五、最后通过报错信息,以及个人经验检测错误。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值