linux學(xué)習(xí)shell腳本

1. 什么是shell script

shell script 是利用 shell 的功能所寫的一個『程序 (program)』,這個程序是使用純文本文件,將一些 shell 的語法與指令(含外部指令)寫在里面, 搭配正規(guī)表示法、管線命令與數(shù)據(jù)流重導(dǎo)向等功能,以達(dá)到我們所想要的處理目的。
簡單的說, shell script 就像是早期 DOS 年代的批處理文件 (.bat) ,最簡單的功能就是將許多指令匯整寫在一起, 讓使用者很輕易的就能夠 one touch 的方法去處理復(fù)雜的動作 (執(zhí)行一個文件 "shell script" ,就能夠一次執(zhí)行多個指令)。 而且 shell script 更提供數(shù)組、循環(huán)、條件與邏輯判斷等重要功能,讓用戶也可以直接以 shell 來撰寫程序,而不必使用類似 C 程序語言等傳統(tǒng)程序撰寫的語法呢!
我的理解:
是一個程序,通過這個程序的語法,你可以操作linux系統(tǒng)上的資源。比如我們發(fā)布服務(wù),需要設(shè)置環(huán)境變量,清理目錄,上傳jar包等操作。

2. 為什么要學(xué)習(xí)

2.1 自動化管理的重要依據(jù)

管理一部主機(jī)真不是件簡單的事情,每天要進(jìn)行的任務(wù)就有:查詢登錄檔、追蹤流量、監(jiān)控用戶使用主機(jī)狀態(tài)、主機(jī)各項(xiàng)硬設(shè)備狀態(tài)、 主機(jī)軟件更新查詢、更不要說得應(yīng)付其他使用者的突然要求了。而這些工作的進(jìn)行可以分為: (1)自行手動處理,或是 (2)寫個簡單的
程序來幫你每日『自動處理分析』這兩種方式,你覺得哪種方式比較好? 當(dāng)然是讓系統(tǒng)自動工作比較好,對吧!呵呵~這就得要良好的 shell script 來幫忙的啦!

2.2 連續(xù)指令單一化

其實(shí),對于新手而言, script 最簡單的功能就是:『匯整一些在 command line 下達(dá)的連續(xù)指令,將他寫入 scripts 當(dāng)中,而由直接執(zhí)行 scripts 來啟動一連串的 command line 指令輸入!』例如: 防火墻連續(xù)規(guī)則 (iptables),開機(jī)加載程序的項(xiàng)目 (就是在 /etc/rc.d/rc.local 里頭的數(shù)據(jù)) ,等等都是相似的功能啦! 其實(shí),說穿了,如果不考慮 program 的部分,那么 scripts 也可以想成『僅是幫我們把一大串的指令匯整在一個文件里面, 而直接執(zhí)行該文件就可以執(zhí)行那一串又臭又長的指令段!』就是這么簡單啦!

3. script 的執(zhí)行方式差異

3.1 利用直接執(zhí)行的方式來執(zhí)行 script

當(dāng)使用直接指令下達(dá) (不論是絕對路徑/相對路徑還是 ${PATH} 內(nèi)),或者是利用 bash (或 sh) 來下達(dá)腳本時, 該 script 都會使用一個新的 bash 環(huán)境來執(zhí)行腳本內(nèi)的指令!也就是說,使用這種執(zhí)行方式時, 其實(shí) 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 』


image.png

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" ]

  1. 在中括號 [] 內(nèi)的每個組件都需要有空格鍵來分隔;
  2. 在中括號內(nèi)的變數(shù),最好都以雙引號括號起來;
  3. 在中括號內(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
當(dāng)條件判斷式一成立時,可以進(jìn)行的指令工作內(nèi)容;
elif [ 條件判斷式二 ]; then
當(dāng)條件判斷式二成立時,可以進(jìn)行的指令工作內(nèi)容;
else
當(dāng)條件判斷式一與二均不成立時,可以進(jìn)行的指令工作內(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
選項(xiàng)與參數(shù):
-n :不要執(zhí)行 script,僅查詢語法的問題;
-v :再執(zhí)行 sccript 前,先將 scripts 的內(nèi)容輸出到屏幕上;
-x :將使用到的 script 內(nèi)容顯示到屏幕上,這是很有用的參數(shù)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容