
shell脚本注意事项整理
- 使用 bash。使用 zsh 或 fish 或其他任何 shell,会让其他人很难理解 / 协作。在所有 shell 中,bash 在可移植性和开发体验之间取得了良好的平衡。
- 只需将第一行设置为 #!/usr/bin/env bash,即使您不为脚本文件赋予可执行权限也可以。
- 为您的文件使用 .sh(或 .bash)扩展名。不使用扩展名的脚本可能很有创意,但除非您的情况明确依赖于它,否则您可能只是想做一些聪明的事情。聪明的东西很难理解。
- 在脚本的开头使用 set -o errexit。
这样,当一个命令失败时,bash 会退出而不是继续执行脚本的其余部分。
- 最好使用 set -o nounset。您可能有一个很好的理由不这样做,但是我个人认为最好始终设置它。这将使脚本在访问未设置的变量时失败。防止由于变量名拼写错误而造成可怕的意外后果。当您需要访问可能已设置或未设置的变量时,请使用${VARNAME-} 而不是$VARNAME 这样就没问题了。
- 使用 set -o pipefail。同样,您可能有很好的理由不这样做,但我建议始终设置它。
- 这将确保即使管道中的一个命令失败,管道命令也将被视为失败。
- 使用 set -o xtrace,并检查 $TRACE 环境变量。
- 用于复制粘贴:if [[ "${TRACE-0}" == "1" ]]; then set -o xtrace; fi。
- 这有助于大大提高脚本的调试能力。
- 可以通过运行 TRACE=1 ./script.sh 而不是 ./script.sh 来启用调试模式。在 if / while 语句中使用 [[ ]] 条件,而不是 [ ] 或 test。
- [[ ]] 是 bash 内置的关键字,比 [ ] 或 test 更强大。
- 其中一个例外是在 [[ ]] 条件的左边。但即使在那里,我也建议加上引号。
- 当您需要不带引号的行为时,使用 bash 数组可能会更好。
- 在函数中使用局部变量。
- 始终使用双引号引用变量访问。
- 接受多种方式的用户请求帮助并做出相应回应。
检查第一个参数是否为 -h 或 --help 或 help 或只有 h 或甚至 -help,在所有这些情况下,打印帮助文本并退出。请为了您未来的自己而这样做。
- 在打印错误消息时,请将其重定向到 stderr。
- 使用 echo 'Something unexpected happened' >&2。尽可能使用长选项(如 --silent 而不是 -s)。这有助于明确记录您的命令。
但请注意,一些系统(如 macOS)提供的命令并不总是具有长选项。如果适当,可以在脚本的开始处更改到脚本的目录。
- 通常情况下,这是合适的。使用 cd "$(dirname "$0")",这在大多数情况下都有效。
- 使用 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 "$@"
总结

注意项整理
更多shell最佳实践可以去专栏了解更多内容,持续更新生产环境的各种最佳实践和解决问题的思路方法,以及各种shell脚本共享: