shell編程規範

1 腳本名以.sh結尾,名稱儘可能見名之意,好比ClearLog.sh Clear_Log.sh clearlog.sh SerRestart.sh Ser_Restart.sh;
2 儘可能使用UTF-8編碼,註釋及輸出儘可能使用英文;
3 通常給到執行權限,但一些關於變量的配置文件不用加執行權限;
4 執行的時候可使用bash 執行,或者使用bash -x執行,能夠直觀的顯示具體的執行過程;
5 腳本首行使用/bin/bash,沒有空格,不帶任何選項;
6 第二行爲空格,或者是添加一行空註釋
7 接着開始註釋內容:文件名、功能描述、做者、最後修改日期、版本號以及一些說明,還加上郵箱/手機號作爲聯繫,若是能夠,須要加上版權聲明; 
8 註釋內容以後空一行開始定義shell腳本中的變量;
9 腳本內的變量定義,儘可能使用大寫,或者大小寫駝峯寫法,或者使用下劃線鏈接的方式。變量名要見名之意,避免a,b,c相似的定義,變量的定義先後不要用空格。
          若是是整形,須要使用declare -i來聲明。
          若是是數組,則須要使用declare -a來聲明。
          若是是隻讀變量,則須要使用declare -r來聲明。
          變量值儘可能使用雙引號引發來,若是要使用強引用,如變量值中包含$符號,則使用」單引號引發來。
          若是要將命令的執行結果賦值給變量,則使用反引號,或者使用$().
10 變量的引用使用如下方式:
         ${GameZone}
         $GameZone
         推薦使用第一種,如:tar zcf ${GameZone}.tar.gz /apps/data/
11 單引號和雙引號混合使用的場景:
         echo ‘Welcome to 「my school」‘
12 在某些特殊的環境下,shell腳本里引用的命令,有多是本身定義的bin路徑,在執行的時候會報出command not found,html

        解決的方式是在執行的時候命令跟全路徑,或者在腳本的開始,顯式的設置一下PATH 變量,nginx

        如: export PATH=」/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/apps/bin/」shell

13 建議在腳本執行的開始重讀下/etc/profile 或者是本身定義的關於環境變量的配置文件,推薦使用source,數據庫

        如: source /etc/profile
               source /opt/sh/appenv.sh
14 使用here document;
        若是腳本在執行的時候須要大段輸出提示信息,但是使用如下方式:
        cat << EOF
       This scripts used for XXX
       Usage:$0 [option]
       Pls be careful.
       Enjoy Yourself.
       EOF
       若是隻是單行提示信息,但是使用echo的方式,能夠添加顏色:
       echo 「Welcome to use my script」
15 若是須要在腳本里生成配置文件的模板,也可使用here document的方式,示例以下:
       cat>>/etc/rsyncd.conf<<EOF
       log file = /usr/local/logs/rsyncd.log
       transfer logging = yes
       log format = %t %a %m %f %b
       syslog facility = local3
       timeout = 300
       [data1]
       path=/home/username
       list=yes
       ignore errors
       auth users = data1user
       secrets file=/etc/rsyncd/rsyncd.secrets
       comment = some description about this moudle
       exclude = test1/ test2/
       EOF
16 若是須要建立臨時文件,可使用以下方式:
       mktemp -d /tmp/file$$
17 條件測試的時候,儘可能使用[[]],而不用[]或者test,由於[[]]功能會更強大                                              
       [[ -d /tmp/logs ]]
      不在使用[ 「x$NAME」 == 「x」 ]這種方式;
18 算數運算使用(())或者是中括號,可是記得括號裏面的變量不要再加$
       ((12+i))
       而非((12+$i))
19 使用高級變量的用法,好比使用
       ${GameZone:?」Error Message」}確保關鍵變量已經定義
       ${GameZone:=」S1″} 或者設置默認值
       不然:
       rm -rf ${GameZone}/* 後果不堪設想
20 可使用&& ||來替代簡單的if-then-else-fi語句。
21 儘可能給每條語句或者代碼段的執行給一個執行結果狀態,若是某條命令執行失敗,則exit N.
       儘量使用$?來檢查前面一條命令的執行狀態。
22 流程控制語句儘可能使用一下方式:
       for I in {1..10};do
        ..。
       done
       while true;do
        …
       done
       if [];then
        …
       fi
23 若是命令過長,能夠分紅多行來寫,好比:
       ./configure \
       –prefix=/usr \
       –sbin-path=/usr/sbin/nginx \
       –conf-path=/etc/nginx/nginx.conf \
       –error-log-path=/var/log/nginx/error.log \
       –http-log-path=/var/log/nginx/access.log \
       –pid-path=/var/run/nginx/nginx.pid  \
       –lock-path=/var/lock/nginx.lock \
24 shell腳本並不要求強制縮進,可是要養成縮進的好習慣,可使用兩個空格,建議使用tab鍵。如:
       if [];then
         …
       fi
25 儘量多的註釋信息。
26 想要獲取當前腳本所在目錄,可使用
      ScriptDir=$(cd $(dirname $0) && pwd)
27 儘量的使用函數的功能,將不一樣的功能定義爲函數,直接引用函數;
28 若是自定義環境變量,能夠專門寫到一個文件中,避免在/etc/profile中添加;
29 禁止使用SUID和SGID以及ACL用戶訪問控制列表的功能,若是須要較高權限,可使用sudo;
30 關鍵的操做須有日誌輸出,專門記錄操做的成功或者失敗以及執行的時間點。
31 腳本內可能包含敏感信息,如服務器密碼或者是數據庫密碼,若是公開以前先確認敏感信息是否已經刪除。數組

相關文章
相關標籤/搜索