編寫shell指令碼的一些規範
直譯器
shell指令碼一般選擇bash作為直譯器,指令碼開頭應為
#!/bin/bash
或
#!/bin/sh
新增指令碼版本和註釋功能
在指令碼的開頭加註釋,說明指令碼作者、編寫時間、指令碼功能,最好可以加上指令碼的版本號。shell中指令碼註釋用#
,註釋語句和#
號之間有一個空格
#!/bin/bash
# 指令碼版本
# 指令碼作者
# 指令碼時間
# 指令碼功能
新增指令碼除錯
通過set
命令新增指令碼除錯,如果報錯,指令碼直接退出,不繼續執行,對於管道錯誤也可以直接退出
#!/bin/bash
# 指令碼版本
# 指令碼作者
# 指令碼時間
# 指令碼功能
set -e
set -o pipfail
變數命名
變數命名要統一規範,shell變數建議使用全部大寫,意思清晰明瞭,如果是多個字元,可以採用下劃線進行切割,如APACHE_LOG_PATH
,對於變數的引用可以直接使用$
,如果有下劃線分割槽的變數,建議使用${APACHE_LOG_PATH}
。
全域性變數和區域性變數
全域性變數可以採用前面時候的定義方式,如果是函式中的區域性變數,建議使用local
進行變數宣告。這個防止全域性變數和區域性變數混淆,區域性變數可以採用小寫,用來區分區域性變數和全域性變數。
function TestFunc(){
local name='xiaolangjun'
echo ${name}
}
如果存在變數合併的情況,比如目錄和檔名合併,這樣可以重新賦值成一個新的變數,這樣方便以後呼叫。
命名規範
函式命名
函式命名一般單詞的首字母大寫,比如GetInformation
,意思清晰。
- 獲取最大值或最小值時字尾使用
Max
、Min
- 獲取資訊或者返回值的函式可以使用
Get
作為字首 - 判斷函式可以使用
Is
作為字首
指令碼命名
指令碼命名,根據指令碼功能進行命名,字尾為.sh
,如果在指令碼執行過程中產生一些臨時檔案,建議採用PID為字尾,如果指令碼執行完成,這個檔案沒有用途,則自動進行刪除。
PID=$$
TMP_FILE="ip_list".${PID}
函式
- 函式定義,建議新增
function
關鍵字 - 函式中縮排可以使用4個空格
- 函式中使用判斷或者迴圈語句,使用統一風格,不要有的換行,有的不換行
- 多管道語句,建議可以進行拆分,增加可讀性,可以將通用部分提取
- 使用
&&
或||
可以簡化判斷語句,語義更加清晰
引用模組或檔案
引用指令碼或者模組檔案時,新增註釋,簡要說明模組的主要功能和作用,使用.
或者source
指令碼日誌
指令碼中建議新增日誌函式,這樣方便指令碼除錯,指令碼執行中各函式的輸出和狀態,日誌檔案中包括時間-日誌級別-函式,日誌建立log目錄,有常規的log和錯誤log。
配置檔案
在工程目錄下建立conf目錄,配置檔案以.conf為字尾,配置欄位要風格統一,每個配置提供相關配置註釋
其他
- 指令碼中路徑變數,建議使用絕對路徑,最後面不要使用/結尾,例如:
LOG_DIR="/var/log"
- 如果指令碼中有重要檔案拷貝,建議使用md5進行一致性檢查,尤其是遠端拷貝