编写健壮的shell脚本有哪些规则?

per*_*ror 12 shell robustness

我最近用我编写的shell脚本擦除了我的主目录的一部分.幸运的是,我确实击中了Ctrl- C足够快以避免最坏的情况.

我的错误在于过分依赖相对路径.从现在开始,我总是在更改目录时使用绝对路径...但是,它引出了一个有趣的问题:编写健壮的shell脚本有哪些规则?

我已经知道,当从目录移动到另一个目录时,应始终使用绝对路径.但是,必须有很多其他的(例如,当命令失败时该怎么做,什么是停止脚本并告知用户有关它的好方法).

那么,有没有人有一个专门针对shell脚本的规则和提示的列表?

Sto*_*ica 11

一些想法:

  1. -e例如,在shebang中使用flag #!/bin/sh -e.这样脚本将在第一个错误时停止.这有点像扔RuntimeExceptionJava.这可能确实拯救了我的屁股几次,我觉得在这种情况下它也会帮助你.

  2. 处理脚本中所有语句的退出代码.实际上-e在shebang 使用会迫使你这样做.

  3. 不要用命令链接命令;.请&&改用.再次,-e在shebang中使用将迫使你这样做.

  4. 正确引用可能包含空格或其他特殊字符的路径.

  5. 如果脚本在没有参数的情况下使用时不会做危险的事情,那是最好的.

  6. 对于非平凡的脚本,请确保打印有用消息的标志-h--help标志.(我使用此脚本生成带有标志解析的脚本.)对于在没有参数的情况下调用时可以执行危险操作的脚本,这应该是必需的.

  7. exit 1在任何非正常退出时使用显式退出脚本.处理if块中的错误,echo一些有用的消息,然后exit没有任何参数是一个常见的错误.由于exit使用了最后一个命令的退出代码,在这种情况下echo,它将成功退出.请注意,在我之前链接的示例脚本中,我exit 1在处理--help标志后打印了帮助消息.

  8. 如果您不需要bash功能,请使用#!/bin/shshebang并尝试与旧版本保持兼容.我认为,便携式是一种坚固性.

  9. $()而不是``.更容易阅读~~更难犯错误.

  10. 很好地一致地格式化代码.更容易阅读~~健壮性.

  11. 请注意平台之间的差异.例如,格式中的两者date --isodate +%F打印日期2013-11-17,但第一个仅适用于GNU系统,第二个也适用于BSD和Solaris.所以date +%F始终使用,它无处不在.当然有100个这样的例子.如果您正在做一些您不习惯的事情,请尝试检查它是否也适用于其他系统.

  12. 测试空变量,尤其是在危险命令中rm -fr.例如,rm -rf "$TOPDIR/$OBJDIR"如果TOPDIR或/和OBJDIR恰好为空或未设置,则结果可能是灾难性的.通常,仔细检查或三重检查危险命令的可能参数值,如下所示.

  13. 不要超越shell脚本的限制.脚本应该是胶水代码.如果你发现自己做了一些棘手的事情,或者你需要晦涩难懂的功能,那么你最好转向更强大的语言.

最后,这些都不会阻止你犯下愚蠢的错误.

PS:我会继续回来并添加更多东西,因为我记得它们.请随时建议改进,我会添加它们.谢谢.