我最近用我写的一个 shell 脚本删除了我的主目录的一部分。幸运的是,我确实足够快地按下 Ctrl-C 以避免最坏的情况。
我的错误是过分依赖相对路径。从现在开始,我总是在更改目录时使用绝对路径……但是,这让我想到了一个有趣的问题:编写健壮的 shell 脚本的规则是什么?
我已经知道从一个目录移动到另一个目录时应该始终使用绝对路径。但是,必须有很多其他的(例如,当命令失败时该怎么办,停止脚本并通知用户的好方法是什么)。
那么,是否有人有专门针对 shell 脚本的此类规则和提示的列表?
最佳答案
几个想法:
-e
Shebang 中的标志,例如 #!/bin/sh -e
.这样脚本就会在第一个错误处停止。有点像扔RuntimeException
在 java 。这可能确实救了我几次,我觉得在这种情况下它也会帮助你。 -e
在shebang中会强制你这样做。 ;
链接命令.使用 &&
反而。再次使用 -e
在shebang中会强制你这样做。 -h
和 --help
打印有用消息的标志。 (我使用 this script 生成带有标志解析的脚本。)对于在不带参数的情况下调用时可能会做危险事情的脚本,这应该是强制性的。 exit 1
退出脚本在任何非正常退出。在 if
中处理错误是一个常见的错误。块,echo
一些有用的消息,然后 exit
没有任何争论。自 exit
使用最后一个命令的退出代码,在本例中 echo
,它将成功退出。请注意,在我之前链接的示例脚本中,我 exit 1
处理 --help
时打印帮助信息后旗帜。 bash
功能,使用 #!/bin/sh
shebang 并尝试与旧版本保持兼容。我认为便携是一种鲁棒性。 $()
而不是 ``
.更容易阅读~~更难犯错误。 date --iso
和 date +%F
以 2013-11-17
格式打印日期,但第一个只适用于 GNU 系统,第二个也适用于 BSD 和 Solaris。所以使用 date +%F
总是,它适用于任何地方。像这样的例子当然有数百个。如果您每天都在做一些不习惯的事情,请尝试检查它是否也适用于不同的系统。 rm -fr
.例如 rm -rf "$TOPDIR/$OBJDIR"
的结果如果 TOPDIR 或/和 OBJDIR 恰好为空或未设置,则可能是灾难性的。通常,双重检查或三重检查像这样的危险命令的可能参数值。 最后,这些都不会阻止你犯愚蠢的错误。
PS:我会继续回来并添加更多我记得的东西。请随时提出改进建议,我会添加它们。谢谢。
关于shell - 编写健壮的 shell 脚本的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034614/