Shell脚本最佳实践

Shell脚本最佳实践

本文讲述的是我多年来在编写shell脚本时所使用的一些最佳实践。纯个人经验性分享。

注意事项

  1. 使用bash。使用zsh或fish或其他任何工具,将使他人难以理解/合作。在所有shell中,bash在可移植性和DX之间取得了很好的平衡。
  2. 只需将第一行设置为#!/usr/bin/env bash,即使您没有给脚本文件可执行权限一样可以执行。
  3. 为文件使用.sh(或.bash)扩展名。不为脚本提供扩展可能有点奇怪,但除非你的用例明确地依赖于扩展,否则您可能只是在尝试做一些机智的事情,但是机智的东西很难理解
  4. 在脚本开始时使用set -o errexit。当一个命令失败时,bash将退出,而不是继续执行脚本的其余部分。
  5. 尽量用set -o nounset。你可能有一个很好的借口不这样做,但我的观点是,最好总是设置它。这将使脚本在访问未设置的变量时失败。避免了可怕的意外后果,列如变量名的错别字。当你想访问一个可能已设置或未设置的变量时,使用”${VARNAME-}”而不是”$VARNAME”,这样就没问题了。
  6. 使用set -o pipefail。同样,你可能有很好的理由不这样做,但我提议始终设置它。这将确保管道命令被视为失败,即使管道中的一个命令失败了。
  7. 使用set -o xtrace,检查$TRACE环境变量。 if [[“${TRACE-0}” == “1”]];then -o xtrace;fi。这对调试脚本有很大协助。人们目前可以启用调试模式,通过运行你的脚本作为TRACE=1 ./script.sh而不是./script.sh。
  8. 在if / while语句中使用[[]]作为条件,而不是[]或test。[[]]是bash内置关键字,比[]或test更强劲。
  9. 总是用双引号引用变量访问。一个可以不这样做的地方是在条件[[]]的左侧。但即便如此,我还是提议你引用。当您需要不加引号的行为时,使用bash数组可能会更好。
  10. 在函数中使用局部变量。
  11. 接受用户寻求协助的多种方式,并以同样的方式给予回应。检查第一个参数是否为-h或–help或help或只是h甚至-help,在所有这些情况下,打印协助文本并退出。写好的脚本过一段时间你就会忘记,使用help信息对你的未来会有协助。
  12. 当打印错误消息时,请重定向到stderr。为此使用echo 'Something unexpected happened' >&2。
  13. 尽可能使用长选项(列如–silent而不是-s)。它们用于显式地记录您的命令。不过请注意,在macOS等某些系统上发布的命令并不总是具有长选项。
  14. 如果合适,脚本路径尽可能在脚本开始的位置。可以避免由于工作路径差异导致的问题。使用cd “$(dirname “$0”)”,这在大多数情况下都有效。
  15. 使用shellcheck。注意它的警告。

脚本模板

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

if [[ "${TRACE-0}" == "1" ]]; then
    set -o xtrace
fi

if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then
    echo 'Usage: ./script.sh arg-one arg-two
    
This is an awesome bash script to make your life better.
'

    exit
fi

cd "$(dirname "$0")"

main() {
    echo do awesome stuff
}

main "$@"

结论

我试着在我的脚本中遵循这些规则,它们至少让我的工作变得更好。不幸的是,在遵守我自己的规则方面,我依旧没有始终如一。所以,也许这样写下来也能协助我在这方面有所提高。

你觉得我还有什么要补充的吗?

请在评论中分享!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
LL-YY-FF的头像 - 宋马
评论 共6条

请登录后发表评论

    暂无评论内容