BASH的保護性程式設計技巧

cjpan發表於2014-07-17

這是我寫BASH程式的招式。這裡本沒有什麼新的內容,但是從我的經驗來看,人們愛濫用BASH。他們忽略了電腦科學,而從他們的程式中創造的是“大泥球”(譯註:指架構不清晰的軟體系統)。

在此我告訴你方法,以保護你的程式免於障礙,並保持程式碼的整潔。

 

不可改變的全域性變數

  • 儘量少用全域性變數
  • 以大寫命名
  • 只讀宣告
  • 用全域性變數來代替隱晦的$0,$1等
  • 在我的程式中常使用的全域性變數:

 

一切皆是區域性的

所有變數都應為區域性的。

  • 自注釋(self documenting)的引數
  • 通常作為迴圈用的變數i,把它宣告為區域性變數是很重要的。
  • 區域性變數不作用於全域性域。

main()

  • 有助於保持所有變數的區域性性
  • 直觀的函數語言程式設計
  • 程式碼中唯一的全域性命令是:main

一切皆是函式

  • 唯一全域性性執行的程式碼是:

– 不可變的全域性變數宣告

– main()函式

  • 保持程式碼整潔
  • 過程變得清晰

  • 第二個例子好得多。查詢檔案是temporary_files()的問題而非main()的。這段程式碼用temporary_files()的單元測試也是可測試的。
  • 如果你一定要嘗試第一個例子,你會得到查詢臨時檔案以和main演算法的大雜燴。

如你所見,這個測試不關心main()。

除錯函式

  • 帶-x標誌執行程式:

只除錯一小段程式碼,使用set-x和set+x,會只對被set -x和set +x包含的當前程式碼列印除錯資訊。
列印函式名和它的引數:

呼叫函式:

會列印到標準輸出:

程式碼的清晰度

這段程式碼做了什麼?

讓你的程式碼說話:

每一行只做一件事

  • 用反斜槓\來作分隔符。例如:

可以寫得簡潔得多:

  • 符號在縮排行的開始

符號在行末的壞例子:(譯註:原文在此例中用了temporary_files()程式碼段,疑似是貼錯了。結合上下文,應為print_dir_if_not_empty())

好的例子:我們可以清晰看到行和連線符號之間的聯絡。

列印用法

不要這樣做:

它應該是個函式:

echo在每一行重複。因此我們得到了這個文件:

注意在每一行的行首應該有一個真正的製表符‘\t’。

在vim裡,如果你的tab是4個空格,你可以用這個替換命令:

命令列引數

這裡是一個例子,完成了上面usage函式的用法。我從Kirk’s blog post – bash shell script to use getopts with gnu style long positional parameters得到這段程式碼

你像這樣,使用我們在頭上定義的不可變的ARGS變數:

單元測試

  • 在更高階的語言中很重要。
  • 使用shunit2做單元測試

這裡是另一個使用df命令的例子:

這裡我有個例外,為了測試,我在全域性域中宣告瞭DF為非只讀。這是因為shunit2不允許改變全域性域函式。

相關文章