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