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 腳本內可能包含敏感信息,如服務器密碼或者是數據庫密碼,若是公開以前先確認敏感信息是否已經刪除。數組