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