由于 shell 脚本语法比较灵活,写 shell 脚本的开发者熟悉的编程语言也有较大差别,你们很容易写出风格迥异的代码出来。若是只有本身一我的用还好,若是是你们合做开发同一个项目,代码风格不一样就会形成不小的麻烦。因此约定一个代码风格是颇有必要的。git
本文中的代码风格约定只是个人我的建议,能够根据本身的需求或者喜欢来调整。本文的代码风格约定,在必定程度上也适用于 bash。github
注意须要有丰富 shell 编程经验的人制定和维护代码风格约定,否则很容易没法执行或者流于形式而解决不了实际问题。代码风格约定不仅须要约定代码怎么写,并且要说明为何要这么写,否则容易由于难以服众而没法推广。shell
缘由:编程
cat
less
diff
等命令都将 tab 显示成 8 个空格,有些命令是不可配置的(即便可配置,要让全部机器配置同步也是件麻烦的事情)。若是本身在编辑器上配置 tab 为 4 个或者 2 个空格,那么就会和 cat
less
等命令的显示方法不一致,会致使不少麻烦。缘由:数组
diff
之类工具对代码进行分析处理也不方便,因此须要约定最长字符数。\
折行,折行后缩进一层(4 个空格)。aa && bb || cc
、[[ ]]
或者 (( ))
中折行,&&
||
放在下一行的行首。缘由:bash
&&
和 ||
在逻辑上属于后半个语句,在天然语言中也是这样,好比 明天我去公园或者去逛街
,若是须要拆成两个子句,那么会是 明天我去公园,或者去逛街
,而不是 明天我去公园或者,去逛街
。对代码来讲也是同样。并且把 &&
或 ||
放在行首更容易对齐,看起来更舒服。+
&&
|
等双元运算符左右要加一个空格。!
~
等一元运算符和做用对象之间不加空格。( )
和 (( ))
{ }
内侧不加空格,[[ ]]
由于语法须要,内侧加一个空格。;
以前不加空格,以后加一个空格。(( ))
中调用函数时),函数名和 (
之间不加空格。if
while
等关键字和后边的内容之间加一个空格。if [[ ]] {
等场景中,{
和前边的内容之间加一个空格。[ ]
之间不加空格,用 [ ]
取数组或者哈希表值时,[ ]
内侧不加空格。>
<
等重定向符号和文件或者文件描述符之间不加空格。缘由:微信
#!/bin/zsh
后加一个空行。if
while
等语句块以后加一个空行。缘由:less
[ ]
,用 [[ ]]
代替。$(( ))
而不是 $[ ]
。缘由:编程语言
[ ]
的功能没有 [[ ]]
丰富,并且两者的用法存在差别,混合使用容易出问题。$[ ]
的功能没有 $(( ))
丰富,混合使用容易出问题。[ ]
在各类地方功能不一致,非必要场景尽可能避免使用。缘由:编辑器
$var
取变量值时,两边不加双引号,除非须要将非字符串变量转换成字符串。${var}
中的大括号。local
定义)。缘由:
$var
读取变量内容时,不用由于变量不存在、值为空、包含特殊符号而产生各类逻辑错误,因此无需在两端加双引号。$var
读变量是不少编程语言都有的用法,而 ${var}
几乎是 shell 中特有的用法,而且输入更麻烦,不必推广这种用法。并且由于不加大括号致使变量名粘连而出错的状况,编写代码时便可识别出来,和外部输入无关,不须要为了不不存在的问题而输入不少额外的大括号。缘由:
name()
或者 function name()
定义函数,但同一个文件中风格要一致。缘由:
name()
定义函数,那么没有照顾 JavaScript 等编程语言开发者的习惯,并且 function
关键字有助于代码的搜索。function name()
定义函数,须要额外输入 9 个字符,而意义有限,投入比产出要大。缘由:
本文介绍了我建议的 zsh 代码风格,能够适当参考。内容待完善。
本文再也不更新,全系列文章在此更新维护:github.com/goreliu/zshguide
付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活订价,欢迎咨询,微信 ly50247。