6條shell小技巧,讓腳本顯得不再業余(1分鐘系列)
長文《memcache核心技術點》閱讀較低,重啟1分鐘系列,快消時代,碎片時間可能大家更喜歡短文,更喜歡技術實踐類文章吧。
畫外音:說實話,技術思路類文章(WHY, HOW),比技術實踐類(WHAT)更難寫。
如何能讓自己的shell顯得不那么業余?下面6點實踐一定有用。
畫外音:本篇文章源自Google的一篇實踐,抽取了部分1分鐘能讀完的內容,加入了一些分析。
一、以下面的語句開場
(1) set -o nounset
在默認情況下,遇到不存在的變量,會忽略并繼續執行,而這往往不符合預期,加入該選項,可以避免惡果擴大,終止腳本的執行。
畫外音:有些變量名的手誤,會讓人崩潰的調試半天,通過這個方式,這類手誤秒發現。
(2) set -o errexit
在默認情況下,遇到執行出錯,會跳過并繼續執行,而這往往不符合預期,加入該選項,可以避免惡果擴大,終止腳本的執行。
畫外音:有些Linux命令,例如rm的-f參數可以強制忽略錯誤,此時腳本便無法捕捉到errexit,這樣的參數在腳本里是不推薦使用的。
這兩個選項,都符合fail fast設計理念。
二、封裝函數有必要
別光顧著一溜往下寫,封裝可以提高復用。
如上例:
- log()
簡單封裝,能夠省去很多
- [$(date +%Y/%m/%d\ %H:%M:%S)]
的重復代碼。
畫外音:這個log()有點意思,學到了嗎?
同時,封裝還能提高代碼的可讀性。
如上例:
- ExtractBashComments
比
- egrep "^#"
的可讀性就高很多。
畫外音:有些抬杠的朋友會說,不認識英文。
三、使用readonly和local修飾變量
- readonly:顧名思義,只讀。
- local:函數內變量。
別圖省事,提高安全性的同時,能避免很多讓人崩潰的莫名其妙的錯誤。腳本寫得專不專業,往往不是什么高深的點,從基本功絕逼能體現。
畫外音:據說,一個C++程序員到什么水平,從ta代碼里const的使用頻度,能夠看出來。
四、使用$()代替`(反單引號)
為什么?看了上面的例子你就懂了:
- $()能夠支持內嵌;
- $()不用轉義;
- 有些字體,`(反單引號)和’(單引號)很像,容易把人搞暈;
五、使用[[]]代替[]
用單中括號:
用雙中括號:
看出差別了么?[[]]更符合人性編碼:
- 避免轉義問題;
- 有不少新功能;
新功能包含但不限于:
- || :邏輯or
- && :邏輯and
- < :字符串比較(不需要轉義)
- == :通配符(globbing)字符串比較
- =~ :正則表達式(regular expression, RegEx)字符串比較
需要注意的是,從bash3.2開始,通配符和正則表達式都不能用引號包裹了(所以,上面的例子,加了引號就是字面比較)。
所以如果表達式里有空格,必須存儲到一個變量里,再進行通配符與正則的比較。
六、echo不是唯一的調試方法
可以用-n對腳本進行語法檢查。
可以用-v跟蹤腳本里的每個命令的執行。
可以用-x跟蹤腳本里的每個命令的執行,并附加擴充信息。
當然,也可以在腳本里,添加
- set -o verbose
- set -o xtrace
來***指定輸出調試信息。
畫外音:多在自己在機器上試一下就明白了。
希望這1分鐘大家有收獲。
【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】