天天看點

Shell腳本的書寫規範與優秀的開發習慣

<--目錄-->

1)腳本子產品名

2)代碼架構

3)函數規範

4)腳本存放規範

5)補充規範19條

6)優秀的開發習慣

【腳本子產品名】

1、正常Shell腳本使用統一後辍:.sh,例:wsyht.sh

2、子產品的啟動和停止腳本統一命名為start_{子產品名}.sh和sop_{子產品名}.sh

3、監控腳本可以*_mon.sh為後辍,控制腳本以*_ctl.sh為後辍

4、子產品(及其腳本和二進制程式)命名應該代表其特性和功能,不要使用個人名字縮寫等形式命名

5、子產品中的腳本和二進制程式命名禁止和其它腳本和二進制程式重名

【代碼架構】

1、腳本開頭解釋器聲明為 #!/bin/bash,也可以為#!/bin/sh,盡量統一

2、配置檔案及庫函數腳本等的引用如,source conf/httpd.conf

3、主腳本過程隻實作程式主幹,功能實作盡量封裝在子函中

4、對于能獨立執行的腳本要有 usage 和 version 函數,可以輸出腳本用法和版本資訊

5、規範代碼樹如下:

[root@localhost ~]# tree

|-- bin

| `-- ipsecct

|-- conf

| `-- ipsec.cfg

`-- func

`-- functions

【函數規範】

1、函數定義時在函數名前加上function保留字,雖然/etc/init.d/functions中沒有這樣做

2、盡量一行一條語句,而不是使用":"将多個語句隔開,盡可能多的判斷操作是否成功,并對其進行相應處理

3、對于重要的函數,需說明函數用途,參數,傳回值,作者,版本

【腳本存放規範】

1、服務控制腳本統一放置在/service/scripts目錄下;如果多個運維人員,可以放在以自已使用者命名的二級目錄下

      如/server/scrips/username;比如我開發的腳本可以放在/server/scripts/wsyht下

【補充規範19條】

1、必須要有基本的日志輸出

2、要關注腳本的效率和系統消耗,綜合、平衡的考慮

3、函數參數傳遞:在調用函數時,向函數傳遞的參數如果是以變量的方式進行傳遞

     必須使用雙引号将變量引起,這是為了防止某個變量中以多個空格分隔的字段,導緻函數誤認為是多個參數

4、避免cat大檔案。比如for id in `cat id_file`;do … ;done。而是采用readline形試讀入檔案

5、對上一個指令需要if [ $? ]判斷傳回值,對于異常分支,需有相應的處理政策;或列印warning日志,或提示後退出

6、sort超過1G資料檔案時,必須用-T指定臨時檔案夾,推薦在使用到sort的時候就使用-T指定到自身的TMP目錄

7、避免使用大的while/for循環,如果實在需要,請考慮用awk指令替代

8、對于一系列有嚴格依賴關系的指令,請使用&&來處理

      比如:make mydir && mv myfile mydir; 對于有前後次序的腳本,禁止采用背景運作 & 指令。(推薦)

9、腳本運作前後,注意清除過期資料(上次運作生成的資料),注意rm的風險,可考慮替代方法,如find

10、對于功能較為複雜的腳本,考慮使用一些函數對功能點進行封裝。這樣可以使腳本清晰易讀。(推薦)

11、任何出錯情況必須将出錯資訊列印到日志中;嚴重的錯誤必須以郵件或短信報警的形式發出。(必須)

12、對于邏輯比較複雜的腳本,可以使用 set -x 來列印指令執行情況,便于調式和排錯(推薦)。

13、wget之前,注意先删除本地檔案;(推薦)

14、拷貝比較大的檔案,最好先将檔案cp到一個臨時檔案夾,然後mv到目标檔案夾,避免下遊子產品讀取到不完整檔案

15、mv,cp子產品,注意要使用指令全路徑,直接強制替換,如/bin/cp -ap wsyht /tmp

16、腳本中,要注意對單引号'' 雙引号"" 的轉義,不明确轉義啟義的,在自測的時候多加小心。(推薦)

17、例用ps axuw|grep 來擷取資訊時,注意ps列印的最大寬度。建議多打幾個w,例如ps auxwww|grep … ;(推薦)

18、使用sort,uniq,join,comm等指令時,要注意兩點:

1) 是否要求排序(例如uniq,join,comm要求輸入檔案是排好序的);

2) 如果排序,要求以什麼方式排序(例如,comm要求輸入檔案是排好序的,而不是數值序);(推薦)

19、對于Java程式腳本要環境變量的,寫腳本前最好通過export重新聲明環境變量,以免在定時任務場合使用出問題

【優秀的開發習慣】

1、盡量少用中文注釋:如果非要用,要根據自身的用戶端對伺服器進行字元集調整

      如:export LANG="zh_CN.GB18030"在腳本中,調整下了符集

2、盡量以.sh為擴充名

      例:script-name.sh

3、書寫代碼習慣:

      a.成對内容的一次寫出來。如:

     {}、[]、''、``、""

      b.流程控制語然一次書寫完,如:

      if語句格式一次完成:

      c: 書寫[]時,添内容之前直接兩端的空格留出來,例: [ content ]

      d.變量的字元串定義加雙引号,等号前後不能有空格。WSYHT_FILE="test.txt"

      e.變量的引用加雙引号,大括号,"{WSYHT_FILE}"

      f.特别注意,腳本中的單引号

4、調整vim文法配置,及内容自動補便配置

本文轉自 2012hjtwyf 51CTO部落格,原文連結:http://blog.51cto.com/hujiangtao/1930661,如需轉載請自行聯系原作者