天天看點

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

重新開機1分鐘系列,快消時代,碎片時間可能大家更喜歡短文,更喜歡技術實踐類文章吧。

畫外音:說實話,技術思路類文章(WHY, HOW),比技術實踐類(WHAT)更難寫。

如何能讓自己的shell顯得不那麼業餘?下面6點實踐一定有用。

畫外音:本篇文章源自Google的一篇實踐,抽取了部分1分鐘能讀完的内容,加入了一些分析。

一、以下面的語句開場

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

set -o nounset

在預設情況下,遇到不存在的變量,會忽略并繼續執行,而這往往不符合預期,加入該選項,可以避免惡果擴大,終止腳本的執行。

畫外音:有些變量名的手誤,會讓人崩潰的調試半天,通過這個方式,這類手誤秒發現。

set -o errexit

在預設情況下,遇到執行出錯,會跳過并繼續執行,而這往往不符合預期,加入該選項,可以避免惡果擴大,終止腳本的執行。

畫外音:有些Linux指令,例如rm的-f參數可以強制忽略錯誤,此時腳本便無法捕捉到errexit,這樣的參數在腳本裡是不推薦使用的。

這兩個選項,都符合fail fast設計理念。

二、封裝函數有必要

别光顧着一溜往下寫,封裝可以提高複用。

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

如上例:

log()

簡單封裝,能夠省去很多

[$(date +%Y/%m/%d %H:%M:%S)]

的重複代碼。

畫外音:這個log()有點意思,學到了嗎?

同時,封裝還能提高代碼的可讀性。

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

ExtractBashComments

egrep "^#"

的可讀性就高很多。

畫外音:有些擡杠的朋友會說,不認識英文。

三、使用readonly和local修飾變量

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

readonly

顧名思義,隻讀。

local

函數内變量。

别圖省事,提高安全性的同時,能避免很多讓人崩潰的莫名其妙的錯誤。腳本寫得專不專業,往往不是什麼高深的點,從基本功絕逼能展現。

畫外音:據說,一個C++程式員到什麼水準,從ta代碼裡const的使用頻度,能夠看出來。

四、使用$()代替`(反單引号)

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

為什麼?看了上面的例子你就懂了:

(1)$()能夠支援内嵌;

(2)$()不用轉義;

(3)有些字型,`(反單引号)和’(單引号)很像,容易把人搞暈;

五、使用[[]]代替[]

用單中括号:

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

用雙中括号:

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

看出差别了麼?[[]]更符合人性編碼:

(1)避免轉義問題;

(2)有不少新功能;

新功能包含但不限于:

|| :邏輯or

&& :邏輯and

< :字元串比較(不需要轉義)

== :通配符(globbing)字元串比較

=~ :正規表達式(regular expression, RegEx)字元串比較

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

需要注意的是,從bash3.2開始,通配符和正規表達式都不能用引号包裹了(是以,上面的例子,加了引号就是字面比較)。

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

是以如果表達式裡有空格,必須存儲到一個變量裡,再進行通配符與正則的比較。

六、echo不是唯一的調試方法

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

可以用-n對腳本進行文法檢查。

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

可以用-v跟蹤腳本裡的每個指令的執行。

6條shell小技巧,讓腳本顯得不再業餘(1分鐘系列)

可以用-x跟蹤腳本裡的每個指令的執行,并附加擴充資訊。

當然,也可以在腳本裡,添加

set -o verbose

set -o xtrace

來永久指定輸出調試資訊。

畫外音:多在自己在機器上試一下就明白了。

希望這1分鐘大家有收獲。

本文轉自“架構師之路”公衆号,58沈劍提供。