03—Shell脚本编写规范
1、shell腳本的第一行是指定賈肯解釋器,通常為:
?
#!/bin/bash
或
#!bin/sh
?
2?、shell腳本的開頭會加版本,版權等信息:
?
#Date:16:29???2017-3-1
#Author:Created?by??XXX?
#Blog:http://XXX.com
#Description:?This??scripts??function?is?.....
#Version:1.1
?
3?、shell腳本命名應以.sh為擴展名。
?
例如:name.sh
?
4?、shell腳本應存放在固定的路徑下
?
例如:/server/scripts
?
5、盡量使用UTF-8編碼,注釋及輸出盡量使用英文
?
6、一般給到執行權限,但一些關于變量的配置文件不用加執行權限;
?
7、第二行為空格,或者是添加一行空注釋
?
8、接著開始注釋內容:文件名、功能描述、作者、最后修改日期、版本號以及一些說明,還加上郵箱/手機號做為聯系,如果可以,需要加上版權聲明;?
?
9?注釋內容之后空一行開始定義shell腳本中的變量;
?
10?腳本內的變量定義,盡量使用大寫,或者大小寫駝峰寫法,或者使用下劃線連接的方式。變量名要見名之意,避免a,b,c類似的定義,變量的定義前后不要用空格。
??????????如果是×××,需要使用declare?-i來聲明。
??????????如果是數組,則需要使用declare?-a來聲明。
??????????如果是只讀變量,則需要使用declare?-r來聲明。
??????????變量值盡量使用雙引號引起來,如果要使用強引用,如變量值中包含$符號,則使用”單引號引起來。
??????????如果要將命令的執行結果賦值給變量,則使用反引號,或者使用$().
11?變量的引用使用以下方式:
?????????${GameZone}
?????????$GameZone
?????????推薦使用第一種,如:tar?zcf?${GameZone}.tar.gz?/apps/data/
12?單引號和雙引號混合使用的場景:
?????????echo?‘Welcome?to?“my?school”‘
13?在某些特殊的環境下,shell腳本里引用的命令,有可能是自己定義的bin路徑,在執行的時候會報出command?not?found,
?
????????解決的方式是在執行的時候命令跟全路徑,或者在腳本的開始,顯式的設置一下PATH?變量,
?
????????如:?export?PATH=”/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/apps/bin/”
?
14?建議在腳本執行的開始重讀下/etc/profile?或者是自己定義的關于環境變量的配置文件,推薦使用source,
?
????????如:?source?/etc/profile
???????????????source?/opt/sh/appenv.sh
15?使用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”
16?如果需要在腳本里生成配置文件的模板,也可以使用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
17?如果需要創建臨時文件,可以使用如下方式:
???????mktemp?-d?/tmp/file$$
18?條件測試的時候,盡量使用[[]],而不用[]或者test,因為[[]]功能會更強大??????????????????????????????????????????????
???????[[?-d?/tmp/logs?]]
??????不在使用[?“x$NAME”?==?“x”?]這種方式;
19?算數運算使用(())或者是中括號,但是記得括號里面的變量不要再加$
???????((12+i))
???????而非((12+$i))
20?使用高級變量的用法,比如使用
???????${GameZone:?”Error?Message”}確保關鍵變量已經定義
???????${GameZone:=”S1″}?或者設置默認值
???????否則:
???????rm?-rf?${GameZone}/*?后果不堪設想
21?可以使用&&?||來替代簡單的if-then-else-fi語句。
22?盡量給每條語句或者代碼段的執行給一個執行結果狀態,如果某條命令執行失敗,則exit?N.
???????盡可能使用$?來檢查前面一條命令的執行狀態。
23?流程控制語句盡量使用一下方式:
???????for?I?in?{1..10};do
????????..。
???????done
???????while?true;do
????????…
???????done
???????if?[];then
????????…
???????fi
24?如果命令過長,可以分成多行來寫,比如:
???????./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?\
25?shell腳本并不要求強制縮進,但是要養成縮進的好習慣,可以使用兩個空格,建議使用tab鍵。如:
???????if?[];then
?????????…
???????fi
26?盡可能多的注釋信息。
27想要獲取當前腳本所在目錄,可以使用
??????ScriptDir=$(cd?$(dirname?$0)?&&?pwd)
?
28?盡可能的使用函數的功能,將不同的功能定義為函數,直接引用函數;
?
29?如果自定義環境變量,可以專門寫到一個文件中,避免在/etc/profile中添加;
?
30?禁止使用SUID和SGID以及ACL用戶訪問控制列表的功能,如果需要較高權限,可以使用sudo;
?
31?關鍵的操作須有日志輸出,專門記錄操作的成功或者失敗以及執行的時間點。
?
32?腳本內可能包含敏感信息,如服務器密碼或者是數據庫密碼,如果公開之前先確認敏感信息是否已經刪除。
?
轉載于:https://blog.51cto.com/6854290/2324196
總結
以上是生活随笔為你收集整理的03—Shell脚本编写规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Android手机CPU不同架构的问
- 下一篇: Django模板渲染——(二)