1. 什么是shell script
shell script 是利用 shell 的功能所寫的一個『程序 (program)』,這個程序是使用純文本文件假栓,將一些 shell 的語法與指令(含外部指令)寫在里面猾漫, 搭配正規(guī)表示法点晴、管線命令與數(shù)據(jù)流重導向等功能,以達到我們所想要的處理目的悯周。
簡單的說粒督, shell script 就像是早期 DOS 年代的批處理文件 (.bat) ,最簡單的功能就是將許多指令匯整寫在一起禽翼, 讓使用者很輕易的就能夠 one touch 的方法去處理復雜的動作 (執(zhí)行一個文件 "shell script" 坠陈,就能夠一次執(zhí)行多個指令)萨惑。 而且 shell script 更提供數(shù)組、循環(huán)仇矾、條件與邏輯判斷等重要功能庸蔼,讓用戶也可以直接以 shell 來撰寫程序,而不必使用類似 C 程序語言等傳統(tǒng)程序撰寫的語法呢贮匕!
我的理解:
是一個程序姐仅,通過這個程序的語法,你可以操作linux系統(tǒng)上的資源刻盐。比如我們發(fā)布服務(wù)掏膏,需要設(shè)置環(huán)境變量,清理目錄敦锌,上傳jar包等操作馒疹。
2. 為什么要學習
2.1 自動化管理的重要依據(jù)
管理一部主機真不是件簡單的事情,每天要進行的任務(wù)就有:查詢登錄檔乙墙、追蹤流量颖变、監(jiān)控用戶使用主機狀態(tài)、主機各項硬設(shè)備狀態(tài)听想、 主機軟件更新查詢腥刹、更不要說得應付其他使用者的突然要求了。而這些工作的進行可以分為: (1)自行手動處理汉买,或是 (2)寫個簡單的
程序來幫你每日『自動處理分析』這兩種方式衔峰,你覺得哪種方式比較好? 當然是讓系統(tǒng)自動工作比較好蛙粘,對吧垫卤!呵呵~這就得要良好的 shell script 來幫忙的啦!
2.2 連續(xù)指令單一化
其實出牧,對于新手而言穴肘, script 最簡單的功能就是:『匯整一些在 command line 下達的連續(xù)指令,將他寫入 scripts 當中崔列,而由直接執(zhí)行 scripts 來啟動一連串的 command line 指令輸入!』例如: 防火墻連續(xù)規(guī)則 (iptables)旺遮,開機加載程序的項目 (就是在 /etc/rc.d/rc.local 里頭的數(shù)據(jù)) 赵讯,等等都是相似的功能啦! 其實耿眉,說穿了边翼,如果不考慮 program 的部分,那么 scripts 也可以想成『僅是幫我們把一大串的指令匯整在一個文件里面鸣剪, 而直接執(zhí)行該文件就可以執(zhí)行那一串又臭又長的指令段组底!』就是這么簡單啦丈积!
3. script 的執(zhí)行方式差異
3.1 利用直接執(zhí)行的方式來執(zhí)行 script
當使用直接指令下達 (不論是絕對路徑/相對路徑還是 ${PATH} 內(nèi)),或者是利用 bash (或 sh) 來下達腳本時债鸡, 該 script 都會使用一個新的 bash 環(huán)境來執(zhí)行腳本內(nèi)的指令江滨!也就是說,使用這種執(zhí)行方式時厌均, 其實 script 是在子程序的 bash 內(nèi)執(zhí)行的唬滑!
3.2 利用 source 來執(zhí)行腳本:在父程序中執(zhí)行
該 script 都會使用原來的bash 環(huán)境來執(zhí)行腳本內(nèi)的指令!這也是為啥你不注銷系統(tǒng)而要讓某些寫入 ~/.bashrc 的設(shè)定生效時棺弊,需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』
4. shell腳本判斷語法
4.1 test命令
test -e /dmtsai && echo "exist" || echo "Not exist"
&& 左邊成功右邊就執(zhí)行晶密,否則就不執(zhí)行
|| 左邊f(xié)alse右邊就執(zhí)行,否則不執(zhí)行
-e 表示檔案是否存在模她,無論是文件還是文件夾形式稻艰。還有其他參數(shù)
4.1.1 關(guān)于某個檔名的『文件類型』判斷
test -e file
-e 該『檔名』是否存在?
-f 該『檔名』是否存在侈净,且為文件
-d 該『檔名』是否存在尊勿,且為目錄
4.1.2 關(guān)于文件權(quán)限偵測
test -r file
-r 該文件是否存在且具有讀取權(quán)限
-w 該文件是否存在且具有寫入權(quán)限
-x 該文件是否存在且具有執(zhí)行權(quán)限
4.1.3 兩個文件之間的比較
test file1 -nt file2
-nt (newer than) file1文件比file2文件新
-ot (older than)file1文件比file2文件舊
4.1.4 兩個整數(shù)之間的判斷
test n1 -eq n2
-eq 兩值相等
-ne 兩值不等
-gt n1大于n2
-lt n1小于n2
-ge n1大于等于n2
-le n1小于等于n2
4.1.5 判定字符串的數(shù)據(jù)
test -z string 判斷字符串是否為空,如果是用狱,true
test -n string 判斷字符串是否不為空运怖,如果不為空,true
test str1 == str2 判斷兩字符串是否相等
test str1 != str2 判斷兩字符串不等
4.1.6 多重條件判斷
test -r filename -a -x filename file同時具有r和x權(quán)限才為真
test -r filename -o -x filename file具有r或者x權(quán)限就為真
4.1.7 示例
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
4.2 判斷符號 [ ]
示例:
[ $HOME" == "$MAIL" ]
- 在中括號 [] 內(nèi)的每個組件都需要有空格鍵來分隔夏伊;
- 在中括號內(nèi)的變數(shù)摇展,最好都以雙引號括號起來;
- 在中括號內(nèi)的常數(shù)溺忧,最好都以單或雙引號括號起來
示例:
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
4.3 腳本入?yún)⒄f明
我們知道命令可以帶參數(shù)咏连,比如 ls -al。al是參數(shù)鲁森。 那么腳本是否可以帶參數(shù)祟滴,比如 sh ***.sh start. start是參數(shù)。答案啊可以的歌溉,那么腳本里面如何識別參數(shù)呢
假設(shè)命令為:sh home.sh param1 param2 param3
腳本里面
$0 代表腳本內(nèi)容 home.sh
$1 代表第一個參數(shù) param1
$2 代表第二個參數(shù) param2
$# 代表參數(shù)的個數(shù)垄懂,這里是3
4.2 if 判斷命令
格式如下:
多個條件判斷 (if ... elif ... elif ... else) 分多種不同情況執(zhí)行
if [ 條件判斷式一 ]; then
當條件判斷式一成立時,可以進行的指令工作內(nèi)容痛垛;
elif [ 條件判斷式二 ]; then
當條件判斷式二成立時草慧,可以進行的指令工作內(nèi)容;
else
當條件判斷式一與二均不成立時匙头,可以進行的指令工作內(nèi)容漫谷;
fi
示例:
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what your choice is"
fi
4.3 while 循環(huán)命令
while [ condition ] <==中括號內(nèi)的狀態(tài)就是判斷式
do <==do 是循環(huán)的開始!
程序段落
done <==done 是循環(huán)的結(jié)束
示例:
while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
read -p "Please input yes/YES to stop this program: " yn
done
echo "OK! you input the correct answer."
4.4 shell script 的追蹤與 debug
sh [-nvx] scripts.sh
選項與參數(shù):
-n :不要執(zhí)行 script蹂析,僅查詢語法的問題舔示;
-v :再執(zhí)行 sccript 前碟婆,先將 scripts 的內(nèi)容輸出到屏幕上;
-x :將使用到的 script 內(nèi)容顯示到屏幕上惕稻,這是很有用的參數(shù)竖共!