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表示正常,其他值异常。