由於 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
定義)仍是全局變量(用 typeset -g
定義)。local
定義)。緣由:
$var
讀取變量內容時,不用由於變量不存在、值爲空、包含特殊符號而產生各類邏輯錯誤,因此無需在兩端加雙引號。$var
讀變量是不少編程語言都有的用法,而 ${var}
幾乎是 shell 中特有的用法,而且輸入更麻煩,不必推廣這種用法。並且由於不加大括號致使變量名粘連而出錯的狀況,編寫代碼時便可識別出來,和外部輸入無關,不須要爲了不不存在的問題而輸入不少額外的大括號。緣由:
name()
或者 function name()
定義函數,但同一個文件中風格要一致。緣由:
name()
定義函數,那麼沒有照顧 JavaScript 等編程語言開發者的習慣,並且 function
關鍵字有助於代碼的搜索。function name()
定義函數,須要額外輸入 9 個字符,而意義有限,投入比產出要大。緣由:
緣由:
本系列教程語句風格實例:
if [[ ... ]] {
} elif ((...)) {
} else {
}
case $i {
(a)
...
;;
(*)
...
;;
}複製代碼
POSIX shell 語句風格實例:
if [[ ... ]]; then
elif ((...)); then
else
fi
case $i in
(a)
...
;;
(*)
...
;;
esac複製代碼
本文介紹了我建議的 zsh 代碼風格,能夠適當參考。
全系列文章地址:github.com/goreliu/zsh…
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。