编写健壮的Bash shell脚本.pdfVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2015/6/16 编写健壮的Bash shell脚本 | 贝塔中的DBA 编写健壮的Bash shell脚本 马齿苋 3,936 次查看 阅读评论 发表评论 使用set -u 使用set -e 防御型编程 – 未雨绸缪 注意文件名中的空格 设置trap(Setting traps) 保持原子性(Be atomic) 延伸阅读 许多人都能很快的码出一些shell代码来完成简单的任务 ,而且这种写法将会一直持续下去。问题是编写的 shell脚本经常会包含着许多足以导致脚本运行失败的细小的缺陷(subtle effects)。本文中我就将解释编写一个健 壮的Bash脚本所需要的一些技术 ,告诉你是能做到将这些问题减少到最小的。 使用set -u 你是否会经常遇到因为变量没有赋值而导致脚本无法成功运行的情况呢 ?反正我是经常的遇到。 chroot $1 ... rm -rf $chroot/usr/share/doc 如果你在运行上述脚本的时候忘记了提供一个参数的话 ,最后的结果是你会把所有系统文档都删掉 ,而不是仅 仅删除$chroot下指定的文档。那你该怎么办呢 ?还好 ,Bash提供了一个选项set -u ,使用这个选项可以使脚本在 使用未初始化的变量时直接退出。这个选项的另一个可读性更强点的写法是set -o nounset。 david% bash /tmp/shrink-chroot.sh $chroot david% bash -u /tmp/shrink-chroot.sh /tmp/shrink-chroot.sh: line 3: $1: unbound variable david% 使用set -e 你应该在你编写的每个脚本上方都加上set -e选项 ,打开这个选项之后 ,脚本在运行时碰到返回值不为0的语 句之后会直接退出。使用-e选项的好处是使你能及早的发现问题 ,而不是让错误越滚越大。同样这个选项也有另外 一种可读性更强点的写法set -o errexit。 -e选项可以为你做免费的错误检查 ,如果你忘了检查的话 ,它会替你完成。不过不好的是你无法在使用$?来进 行检查了 ,因为如果返回值不为0的话语句根本就执行不到检查$?的那一步的。解决方法是重写下代码 : 用 command || { echo command failed; exit 1; } data:text/html;charset utf­8,%3Cdiv%20class%3D%22title%22%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20line­height%… 1/5 2015/6/16 编写健壮的Bash shell脚本 | 贝塔中的DBA 或 if ! command; then echo command failed; exit 1; fi 替代 command if [ $?-ne 0]; then echo command failed; exit 1; fi 如果你有一个命令它就是返回0或者是你根本就不关心返回值那怎么办呢 ?你可以使用command || true ,或 者假如你要对很长的一段代码都如此处理的话 ,你可以暂时关闭错误处理 ,不过我的建议是尽量少用。 set +e command1 command2 set -e 另外有个和这个有点相关的说明 :默认情况下Bash返回最后一个管道命令的执行结果 ,你可能不希望是这 样 ,例如false | true执行返回值为是0 ,成功 ;如果你想它是失败的话 ,执行set -o pipefail就可以了。 防御型编程 – 未雨绸缪 你的脚本应该要考虑到应对一些

您可能关注的文档

文档评论(0)

weiwoduzun + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档