今天下午整理了一下自己 GitHub 的 starred project,正巧看到以前收藏的一篇 Bash Style Guide, 闲来无事,就给翻译了。
这篇文章很好,他基于的那篇 Wiki 也非常值得看,我阅读之后,确实感到有一些东西是自己曾经忽视了的。
下面是我翻译的文章,如发现错误,还望及时告知。
Bash 风格指南
本风格指南旨在描述如何编写 bash 脚本,并使其安全和可预测。本指南基于 this wiki,特别是这个页面:
http://mywiki.wooledge.org/BashGuide/Practices
如本指南中有任何东西并未明确提出,则默认遵循这个 wiki 中所描述的观点。
美学
使用制表符还是空格
制表符
分号
你无需在命令行中使用分号(我希望是这样),同样也不要在脚本中使用它。
函数
不要使用关键字 function
创建函数。所有函数中创建的变量都应该声明为局部变量。
代码块声明
then
应与 if
放在同一行,do
应与 while
放在同一行。
间距
不要超过两个连续的换行符(即不超过一行空行)。
注释
注释没有明确的代码风格。除非你重写或者更新注释内容,否则不要因为美观的因素去改动它。
Bash 主义
本风格指南用于 bash。这意味着,如果可以选择,使用 bash 的内建命令或关键字,总是好于外部命令或sh(1)
的语法。
test(1)
使用 [[ ... ]]
进行条件测试, 而不是 [ .. ]
或 test ...
查看 http://mywiki.wooledge.org/BashFAQ/031 了解更多信息。
队列
使用 bash 的内部命令生成队列。
命令替换
使用 $(...)
进行命令替换.
数学 / 整数操作
使用 ((...))
和 $((...))
。
不要使用 let
命令。
参数扩展
使用参数扩展要好于使用外部命令,例如 echo
, sed
, awk
等等。
列出文件
不要使用 解析 ls(1),而使用 bash 内置函数来循环文件。
查明可执行文件路径
简单声明一点,你肯定不知道,如果你视图找出可执行程序的完整路径,你应该反思你的软件设计了。
查看 http://mywiki.wooledge.org/BashFAQ/028 获取更多信息。
数组和列表
只要有可能,尽量使用 bash 数组来代替使用空格(或是换行符、制表符等)分隔的字符串。
内置读取
只要有可能,使用 bash 内置的 read
避免调用外部命令。
例子:
外部命令
GNU 用户工具
全世界不会都运行在 GNU 或 Linux 上;当调用外部命令时,例如 awk
, sed
, grep
,避免 GNU 特定的选项,使其尽量易于移植。
当你编写 bash ,并且使用给你的所有强大工具和 bash 的内建命令时,你会发现甚至很少有机会需要调用外部命令。
UUOC
不要在你不需要的时候使用 cat(1)
。如果程序支持从标准输入读取,使用 bash 重定向传递数据。
如果我们能够推断,当程序说它可以通过名称读取文件,并且这样做能获得更好的性能时,我们可以使用这个内置读取文件方法的命令行工具,而不是标准输入。
风格
引号
当字符串需要变量扩展或命令替换插值的时候使用双引号,其它时候使用单引号。
所有将要经历分词的变量都 必须 被引用 (1)。如果分词不会发生,变量可以不加引号。
- 唯一的例外是,如果代码或 bash 控制着这个变量的整个生命周期。这种情况 basher 有类似的代码:
在这个例子中,虽然在 if
声明中的 $printf_date_supported
将经历分词,但仍然不需要引号,因为这个变量的内容被明确地控制着,并不会从用户或其它命令里取值。
同样的,例如 $$
, $?
, $#
这些变量,也不需要引号,因为他们绝不会包含空格、制表符或换行符。
然而,如果仍怀有疑问,可以查看引用所有的扩展。
变量声明
避免大写的变量名,除非有一个很好的理由使用他们。不要使用 let
或 readonly
创建变量。declare
应该只用于关联数组。在函数中,应始终使用 local
声明变量。
shebang
Bash 不总是位于 /bin/bash
,因此尽量这样来写这一行:
错误检查
举个例子,cd
不总是工作。请务必检查 cd
(或类似的命令)任何可能的错误,如果错误存在就退出或将错误抛出。
set -e
不要设置 errexit
。如同在 C 语言中,有时你想要得到一个错误,或是你期望什么执行失败,并不意味着你想要退出程序。
http://mywiki.wooledge.org/BashFAQ/105
eval
永远不要使用.
没有人会在代码库中接受下面这个链接列出的东西。
http://mywiki.wooledge.org/BashPitfalls
这里也例举了一些如何修复这些问题的例子。
License
MIT License