shell脚本执行命令错误处理

工作有较久时间了,在公司最大有感受就是:有些部门的有些人从不看说明文档;从不看readme文件;从不看代码注释;从不看使用。一旦出错,不从自身找原因,第一个想到的,是问别人,问来问去,最终会问到当事人:当时写代码或写脚本的那个人。我遇到过好几次。有一个脚本,明明已经有readme文件说明要用root权限来执行脚本,脚本中也明明说了要用root权限。但就是不知人家没看到还是没意识到要看,经常搞错,经常问人。最终,我知错了,我不应该在脚本中没有判断出现错误的情况,我真的错了。

为了防止此类事情发生,上网找了一些资料,写了一个专门用于错误处理的函数,主要是通过执行命令的返回值$?来判断是否出错,一量出错,用红色高亮的提示信息提示人家,说出错了,并且退出程序。完整示例脚本如下:

#!/bin/sh # 出错提示测试 #\x1b(八进制为:\033)[显示方式;前景色;背景色m #显示方式:0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显) #前景色:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色) #背景色:40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色) # #\033[0m 默认 #\033[1;32;40m 绿色 #033[1;31;40m 红色 COLOR_G="\x1b[0;32m" # green COLOR_R="\x1b[1;31m" # red RESET="\x1b[0m" STR_ERR="[Oops!! Error occurred!! Please see the message upside!!]" STR_OK="[Job done!]" MSG_ERR=$COLOR_R$STR_ERR$RESET MSG_OK=$COLOR_G$STR_OK$RESET myexit() { if [ $1 -eq "1" ] then echo -e $MSG_ERR ; exit ; fi } # 故意出错 cp aaa bb ret=$? myexit $ret echo -e $MSG_OK

脚本中涉及到的终端的颜色的控制,在脚本中简单提了一下,如果需要详细的,请自行查阅资料。 下面是出错效果:

latelee@latelee:shell-test$ sh test.sh cp: 无法 stat “aaa”: 没有那个文件或目录 [Oops!! Error occurred!! Please see the message upside!!]

红色字体的信息说,出错了,请看上面的信息。上面的信息说“没有那个文件或目录”,如果从这个信息还看不出什么原因,那就没有办法了。 正确效果:
正确效果:

latelee@latelee:shell-test$ sh test.sh [Job done!]

这件事告诉我,不要指望用户会自动读你写的文档;不要指望用户按你的操作习惯来做事。凡事先完善自身,花点时间,保证自己提供的东西OK,然后方给别人折腾。贪一时之快,早晚会找到你的。

本文语法高亮由迟思堂工作室工具手动高亮。  

迟记于2013-04-16