龙空技术网

Shell脚本最佳实践

SuperOps 2586

前言:

目前同学们对“mac编写shell脚本”都比较注意,各位老铁们都需要知道一些“mac编写shell脚本”的相关内容。那么小编在网摘上搜集了一些有关“mac编写shell脚本””的相关内容,希望同学们能喜欢,兄弟们快快来学习一下吧!

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

注意事项使用bash。使用zsh或fish或其他任何工具,将使他人难以理解/合作。在所有shell中,bash在可移植性和DX之间取得了很好的平衡。只需将第一行设置为#!/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 -o xtrace;fi。这对调试脚本有很大帮助。人们现在可以启用调试模式,通过运行你的脚本作为TRACE=1 ./script.sh而不是./script.sh。在if / while语句中使用[[]]作为条件,而不是[]或test。[[]]是bash内置关键字,比[]或test更强大。总是用双引号引用变量访问。一个可以不这样做的地方是在条件[[]]的左侧。但即便如此,我还是建议你引用。当您需要不加引号的行为时,使用bash数组可能会更好。在函数中使用局部变量。接受用户寻求帮助的多种方式,并以同样的方式给予回应。检查第一个参数是否为-h或--help或help或只是h甚至-help,在所有这些情况下,打印帮助文本并退出。写好的脚本过一段时间你就会忘记,使用help信息对你的未来会有帮助。当打印错误消息时,请重定向到stderr。为此使用echo 'Something unexpected happened' >&2。尽可能使用长选项(比如--silent而不是-s)。它们用于显式地记录您的命令。不过请注意,在macOS等某些系统上发布的命令并不总是具有长选项。如果合适,脚本路径尽可能在脚本开始的位置。可以避免因为工作路径差异导致的问题。使用cd "$(dirname "$0")",这在大多数情况下都有效。使用shellcheck。注意它的警告。脚本模板

#!/usr/bin/env bashset -o errexitset -o nounsetset -o pipefailif [[ "${TRACE-0}" == "1" ]]; then    set -o xtracefiif [[ "${1-}" =~ ^-*h(elp)?$ ]]; then    echo 'Usage: ./script.sh arg-one arg-two    This is an awesome bash script to make your life better.'    exitficd "$(dirname "$0")"main() {    echo do awesome stuff}main "$@"
结论

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

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

请在评论中分享!

标签: #mac编写shell脚本