前言:shell script就是針對shell所寫的腳本;shell script就是利用shell的功能所寫的一個(gè)程序,這個(gè)程序使用一個(gè)純文本文件,將一些shell的語法與命令(含外部命令)寫在里面,搭配正則表達(dá)式、管道命令以及數(shù)據(jù)流重定向功能等,達(dá)到我們所想要的處理目的;
shell腳本的用途:
? ? 1)自動化管理系統(tǒng)
? ? 2)追蹤與管理系統(tǒng)的重要工作
? ? 3)檢查入侵
? ? 4)連續(xù)命令單一化
? ? 5)簡單的數(shù)據(jù)處理
shell腳本的優(yōu)缺點(diǎn):
? ? shell腳本常用于系統(tǒng)管理,但是對于大量數(shù)值運(yùn)算的處理,shell腳本的處理速度較慢,并且使用的CPU資源較多,造成主機(jī)資源的分配不良,所以shell腳本不適用于數(shù)值處理相關(guān)工作;
shell腳本編寫時(shí)需要注意的地方:
? ? 1)命令的執(zhí)行方向是從上向下,從左往右的;
? ? 2)命令、參數(shù)間的多個(gè)空白都會被忽略掉,空白行(包含Tab鍵所得的空白)也會被忽略掉;
? ? 3)如果讀取到一個(gè)Enter符號(CR),就嘗試開始執(zhí)行改行的命令串;
? ? 4)如果一行內(nèi)容過多,可以使用/+Enter組合鍵進(jìn)行換行;
? ? 5)“#”可以作為批注,“#”后所有數(shù)據(jù)都會被視為批注文字并被忽略;
shell腳本執(zhí)行方式:
????1)直接命令執(zhí)行:采用此種方法執(zhí)行,shell.sh文件必須要具備可讀與可執(zhí)行的權(quán)限(rx);
????????①絕對路徑:使用如/home/user/shell.sh的絕對路徑執(zhí)行shell腳本;
? ? ? ? ②相對路徑:在/home/user/目錄下,使用如./shell.sh相對路徑執(zhí)行shell腳本;
? ? ? ? ③變量“PATH”:將shell.sh放在PATH指定的目錄內(nèi),例如~/bin/;
? ? 2)以bash進(jìn)程來執(zhí)行:通過“bash shell.sh”或“sh shell.sh”來執(zhí)行,此種方式執(zhí)行shell腳本,只需要腳本文件具有r的權(quán)限即可;
良好的shell腳本編寫習(xí)慣:
? ? 1)腳本要以#! /bin/bash為首行,用以聲明此腳本內(nèi)的語法使用的是bash的語法
? ? 2)應(yīng)該為腳本作出合適詳細(xì)的批注,如腳本的功能、版本信息、作者與聯(lián)系方、建立日期以及歷史記錄等信息
? ? 3)主要環(huán)境變量的聲明
? ? 4)程序的主體部分,即功能的實(shí)現(xiàn)部分
? ? 5)告知執(zhí)行結(jié)果,即返回執(zhí)行結(jié)果
簡單的shell腳本編寫示例如下圖所示:

shell腳本執(zhí)行過程如下圖所示:

shell腳本的執(zhí)行方式的不同會帶來什么不同的結(jié)果呢?
? ? 采用之前的直接執(zhí)行或者以bash子進(jìn)程的方式執(zhí)行shell腳本,都是在一個(gè)與當(dāng)前bash環(huán)境不同的bash環(huán)境中執(zhí)行的,這個(gè)新的bash環(huán)境也可以叫做子進(jìn)程,在子進(jìn)程中執(zhí)行shell腳本,涉及到的變量或操作都不會在父進(jìn)程中出現(xiàn);
? ? 采用source命令執(zhí)行shell腳本,會在當(dāng)前bash環(huán)境中執(zhí)行shell腳本,因此執(zhí)行過程中涉及的變量和操作,就會在當(dāng)前bash環(huán)境中出現(xiàn);
????因此,使用source命令執(zhí)行shell腳本,可以在更改配置文件后,不需要注銷重新登陸,即可使更改后的配置文件生效!
Linux中的常用判斷式:test、[ ]、默認(rèn)變量
? ? 1)test命令:用于檢測系統(tǒng)上是否存在某些文件或相關(guān)的屬性;
? ? test命令的格式:
? ? 判斷文件是否存在或文件類型:test????[-efd]????filename
? ? 判斷文件的權(quán)限:test ? ?[-rwx] ? ?filename
? ? 多重條件判定:test ? ?[-ao] ? ?filename
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? test????!????filename
shell腳本應(yīng)用之test命令示例:

相關(guān)shell腳本執(zhí)行過程如下圖所示:

? ? 2)判斷符號[ ]:中括號常用于if...then...fi等條件判斷式中;
? ? 中括號[]使用時(shí)需要時(shí)需要注意:
????????①在中括號內(nèi)的每個(gè)組件都需要用空格鍵進(jìn)行分隔;
? ? ? ? ②在中括號中的變量或常量,最好都使用雙引號進(jìn)行包含;
shell腳本應(yīng)用之[ ]如下圖所示:

執(zhí)行過程如下圖所示:

shell腳本中的默認(rèn)變量($0,$1...)
? ? 直接舉例,比如下面的命令:
? ? sh????/scripts/sh03.sh????arg1 ? ?arg2 ? ?arg3 ? ?arg4
????????????????????$0 ? ? ? ? ? ? ? ? ? $1 ? ? ? $2 ? ? ? $3 ? ? ? ?$4
? ? 如上所示,第一個(gè)shell腳本名就是默認(rèn)變量$0,后面跟的依次為默認(rèn)變量$1,$2,$3,$4;
shell腳本應(yīng)用之默認(rèn)變量示例如下:

執(zhí)行過程如下圖所示:

Linux中的 if 條件判斷式:
? ? if...then:在編程中,基本上都會使用到if判斷語句,而在shell腳本編程中,同樣也會用到if判斷語句,只不過關(guān)鍵字以及結(jié)構(gòu)上有些不同;
????shell腳本中的最簡單的單層if判斷語句:
????????????????if ? ?[條件判斷式]; ? ?then
????????????????????????當(dāng)條件判斷式成立時(shí),需要進(jìn)行的命令工作內(nèi)容;
????????????????fi
? ? shell腳本中多個(gè)判斷條件的if判斷語句:
? ? ? ? ? ? ? ? if ? ?[條件判斷式1]; ? ?then
? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)條件判斷式1成立時(shí),需要進(jìn)行的命令工作內(nèi)容;
? ? ? ? ? ? ? ? elif ? ?[條件判斷式2]; ? ?then
? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)條件判斷式1不成立但條件判斷式2成立時(shí),可以進(jìn)行的命令工作內(nèi)容;
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)條件判斷式1和2都不成立時(shí),可以進(jìn)行的命令工作內(nèi)容;
? ? ? ? ? ? ? ? fi
shell腳本應(yīng)用之if判斷如下圖所示:

執(zhí)行過程如下圖所示:

if判斷應(yīng)用之綜合案例:判斷當(dāng)前主機(jī)上已經(jīng)啟動的服務(wù);
具體shell腳本如下所示:

執(zhí)行過程如下圖所示:

Linux中的case判斷語句:
case語法如下:
? ? ? ? case????$變量名稱 ? ?in
????????"第一個(gè)變量內(nèi)容")
? ? ? ? ? ? ? ? 程序段
????????????????; ;
? ? ? ? "第二個(gè)變量內(nèi)容")
? ? ? ? ? ? ? ? 程序段
? ? ? ? ? ? ? ? ; ;
? ? ? ? *)
? ? ? ? ????????其他任何變量內(nèi)容對應(yīng)的程序段
? ? ? ? ? ? ? ? ; ;
? ? ? ? esac
case應(yīng)用實(shí)例如下圖所示:

執(zhí)行過程如下圖所示:
