版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
UbuntuLinux操作系統(tǒng)(第3版)(微課版)第8章Shell編程能力CAPACITY要求熟悉Shell編程的基本步驟,掌握腳本的執(zhí)行和調(diào)試方法。了解Shell變量、表達式和運算符,學(xué)會使用它們編寫程序。了解條件語句和循環(huán)語句,學(xué)會編寫流程控制程序。掌握函數(shù)的定義和調(diào)用,學(xué)會使用函數(shù)對Shell程序進行模塊劃分。學(xué)會在Shell腳本中使用正則表達式與文本處理命令,實現(xiàn)自動化運維任務(wù)。Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.1Shell編程基本步驟編寫Shell腳本腳本的編寫Shell腳本本身就是一個文本文件,示例:
#!/bin/bash#顯示”HelloWorld!”
echo"HelloWorld!"與其他腳本語言編程一樣,Shell腳本編程無需編譯器,也不需要集成開發(fā)環(huán)境,一般使用文本編輯器即可。多數(shù)Shell程序員首選的編輯器是Vi或Emacs,在桌面環(huán)境中可直接使用圖形化編輯器gedit或kate。推薦初學(xué)者使用nano字符終端文本編輯器。8.1Shell編程基本步驟編寫Shell腳本Shell腳本的基本構(gòu)成#!/bin/bash#這是一個測試腳本echo-n"當前日期和時間:"dateecho-n"程序執(zhí)行路徑:"$PATHecho"當前登錄用戶名:`whoami`"echo-n"當前目錄:"pwd#end8.1Shell編程基本步驟編寫Shell腳本包含外部腳本包含外部腳本文件的用法如下:
.腳本文件名或
source腳本文件名兩種方式的作用一樣,為簡單起見,一般使用點號,但要注意點號和腳本文件名之間一定要有一個空格。8.1Shell編程基本步驟執(zhí)行Shell腳本執(zhí)行Shell腳本使用指定的Shell解釋器執(zhí)行腳本使用指定的Shell解釋器執(zhí)行腳本,以腳本名作為參數(shù)。Shell解釋器腳本文件[參數(shù)]示例cxz@linuxpc1:~$shhello.shHelloWorld!使用source命令執(zhí)行腳本在當前Shell環(huán)境下讀取并執(zhí)行Shell腳本文件中的代碼并依次執(zhí)行。source腳本文件示例cxz@linuxpc1:~$.hello.shHelloWorld!將輸入重定向到Shell腳本讓Shell從指定文件中讀入命令行,并進行相應(yīng)處理
bash<腳本名示例cxz@linuxpc1:~$bash<hello.shHelloWorld!都不要求腳本文件具有執(zhí)行權(quán)限8.1Shell編程基本步驟調(diào)試Shell腳本利用Shell解釋器的選項實現(xiàn)調(diào)試。Shell解釋器[選項]腳本文件示例cxz@linuxpc1:~$bash-vhello.sh#!/bin/bash#顯示"HelloWorld!"echo"HelloWorld!"HelloWorld!cxz@linuxpc1:~$bash-xhello.sh+echo'HelloWorld!'HelloWorld!Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.2Shell變量變量類型用戶自定義變量在編寫Shell腳本時定義,可以在Shell程序內(nèi)任意使用和修改??梢詫⑺醋骶植孔兞浚瑑H在當前Shell實例中有效。環(huán)境變量作為系統(tǒng)環(huán)境的一部分,不必去定義它們,可以在Shell程序中使用它們,某些變量(如PATH)可以在Shell中加以修改??梢詫⑺醋魅肿兞?。內(nèi)部變量此類變量在程序中用來做出判斷。在Shell程序內(nèi),這類變量的值是不能修改的。8.2Shell變量變量賦值和訪問變量定義變量無須事先聲明,給變量賦值也就是定義一個變量的過程變量名=值變量名的命名應(yīng)當遵循如下規(guī)則:
首個字符必須為字母(a-z,A-Z)中間不能有空格,可以使用下劃線(_)不能使用標點符號不能使用Shell中的關(guān)鍵字8.2Shell變量變量賦值和訪問變量訪問如果要訪問變量值,可以在變量名前面加一個美元符號“$”。通常使用函數(shù)echo來顯示變量。變量名加花括號“{}”是可選的。只讀變量使用readonly命令可以將變量定義為只讀變量,只讀變量的值不能被改變。8.2Shell變量變量賦值和訪問刪除變量使用unset命令可以刪除變量。添加環(huán)境變量使用export命令將變量添加到環(huán)境中,作為臨時的環(huán)境變量(一種全局變量)。export變量名=變量值8.2Shell變量內(nèi)部變量變量說明$0當前腳本的文件名$n傳遞給腳本或函數(shù)的參數(shù)。n是一個數(shù)字,表示第幾個參數(shù)。例如,第1個參數(shù)是$1,第2個參數(shù)是$2,以此類推$#傳遞給腳本或函數(shù)的參數(shù)個數(shù)$*傳遞給腳本或函數(shù)的所有參數(shù)$@傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號("")包含時,與$*稍有不同$?上個命令的退出狀態(tài),或函數(shù)的返回值$$當前Shell進程ID。對于Shell腳本,就是這些腳本所在的進程ID8.2Shell變量位置參數(shù)編寫一個帶有若干參數(shù)的Shell腳本時,可用命令行或從其他Shell腳本調(diào)用位置參數(shù)。位置參數(shù)使用系統(tǒng)給出的專用名,存放在變量中的第1個參數(shù)名為1,可以用$1來訪問;第2個參數(shù)名為2,可以利用$2來訪問它,依此類推。當參數(shù)超過10個時,要用花括號將參數(shù)序號括起來,如${12}。$0是一個比較特殊的位置參數(shù),用于表示腳本自己的文件名。$*和$@都表示傳遞給函數(shù)或腳本的所有參數(shù)。$#是指傳遞參數(shù)的個數(shù)。調(diào)用Shell程序可以省略位置居后的位置參數(shù)。在Shell程序中,可以利用set命令為位置參數(shù)賦值或重新賦值
set[參數(shù)列表]8.2Shell變量變量值輸出echo命令Shell變量可以使用echo命令實現(xiàn)標準輸出,在屏幕上打印出指定的字符串。echo可以用來實現(xiàn)更復(fù)雜的輸出格式控制。輸出內(nèi)容使用雙引號將阻止Shell對大多數(shù)特殊字符進行解釋,但美元符號($)、反引號(`)和雙引號(")仍然保持其特殊意義,如果要在雙引號中的內(nèi)容中顯示這些符號,需要使用轉(zhuǎn)義符。printf命令printf命令用于格式化輸出。printf命令可以提供格式控制字符串,語法如下:
printf格式字符串[參數(shù)列表...]8.2Shell變量變量值讀取使用read命令可以將變量的值作為字符串從鍵盤讀入:
read變量在執(zhí)行read命令時可以不指定變量參數(shù),它會將接收到的數(shù)據(jù)放置在環(huán)境變量$REPLY中。read讀入的變量可以有多個,第一個數(shù)據(jù)給第一個變量,第二個數(shù)據(jù)給第二個變量,如果輸入數(shù)據(jù)個數(shù)過多,則最后所有的值都給第一個變量。下面的腳本示例讀取兩個數(shù),并顯示出來??梢允褂眠x項-n對輸入的字符進行計數(shù),當輸入的字符數(shù)目達到預(yù)定數(shù)目時,自動退出,并將輸入的數(shù)據(jù)賦值給變量。8.2Shell變量變量替換可以使用以下幾種變量替換形式。${var}:替換為變量本來的值。${var:-word}:如果變量var為空或已被刪除,則返回word,但不改變var的值。${var:=word}:如果變量var為空或已被刪除,則返回word,并將var的值設(shè)置為word。${var:?message}:如果變量var為空或已被刪除,則將消息message發(fā)送到標準錯誤輸出,可以用來檢測變量var是否可以被正常賦值。${var:+word}:如果變量var被定義,則返回word,但不改變var的值。8.2Shell變量數(shù)組bash支持一維數(shù)組(不支持多維數(shù)組。在Shell中用括號來表示數(shù)組,數(shù)組元素用空格符號分開數(shù)組名=(值1...值n)可以單獨定義數(shù)組的各個元素??梢圆皇褂眠B續(xù)的下標,而且下標的范圍沒有限制。讀取數(shù)組元素值的語法格式為:
${數(shù)組名[下標]}采用以下用法獲取數(shù)組元素的個數(shù):
${#數(shù)組名[@]}以下方法用于取得數(shù)組單個元素的長度:
${#數(shù)組名[n]}Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.3表達式與運算符表達式算術(shù)表達式bash自身并不支持簡單的數(shù)學(xué)運算,但可通過awk和expr等命令來實現(xiàn)數(shù)學(xué)運算。expr最為常用,使用它能夠完成表達式的求值操作。
expr5+3
更為簡單的方式是使用$[]表達式進行數(shù)學(xué)計算。
val=$[5+3]
操作數(shù)與運算符之間一定要有空格操作數(shù)與運算符之間不能有空格8.3表達式與運算符表達式邏輯表達式邏輯表達式主要用于條件判斷,值為true(或0)表示結(jié)果為真;值為false(非零值)表示結(jié)果為假。通常使用test命令來判斷表達式的真假。
test邏輯表達式Linux每個版本中都包含test命令,但該命令有一個更常用的別名,即左方括號“[”。
[邏輯表達式]當使用左方括號而非test時,其后必須始終跟著一個空格、要評估的邏輯表達式、一個空格和右方括號,右方括號表示所需評估表達式的結(jié)束。邏輯表達式兩邊的空格是必需的。8.3表達式與運算符算術(shù)運算符+:加法-:減法*:乘法/:除法%:取余=:賦值8.3表達式與運算符整數(shù)關(guān)系運算符運算符功能說明示例-eq檢測兩個數(shù)是否相等,相等則返回true[$a-eq$b]返回false-ne檢測兩個數(shù)是否不相等,不相等則返回true[$a-ne$b]返回true-gt檢測運算符左邊的數(shù)是否大于右邊的,如果是,則返回true[$a–gt$b]返回false-lt檢測運算符左邊的數(shù)是否小于右邊的,如果是,則返回true[$X-lt$Y]返回true-ge檢測運算符左邊的數(shù)是否大于或等于右邊的,如果是,則返回true[$X-ge$Y]返回false-le檢測運算符左邊的數(shù)是否小于或等于右邊的,如果是,則返回true[$X-le$Y]返回true8.3表達式與運算符字符串檢測運算符運算符功能說明示例=檢測兩個字符串是否相等,相等則返回true[$a=$b]返回false!=檢測兩個字符串是否不相等,不相等則返回true[$a!=$b]返回true-z檢測字符串長度是否為0,為0則返回true[-z$a]返回false-n檢測字符串長度是否不為0,不為0則返回true[-n“$b”]返回true$檢測字符串是否為空,不為空則返回true[$a]返回true8.3表達式與運算符文件測試運算符運算符功能說明-b檢測文件是否為塊設(shè)備文件,如果是,則返回true-c檢測文件是否為字符設(shè)備文件,如果是,則返回true-d檢測文件是否為目錄文件,如果是,則返回true-f檢測文件是否為普通文件(既不是目錄文件,又不是設(shè)備文件),如果是,則返回true-g檢測文件是否設(shè)置了SGID位,如果是,則返回true-k檢測文件是否設(shè)置了Sticky位,如果是,則返回true-p檢測文件是否為具名管道,如果是,則返回true-u檢測文件是否設(shè)置了SUID位,如果是,則返回true-r檢測文件是否可讀,如果是,則返回true-w檢測文件是否可寫,如果是,則返回true-x檢測文件是否可執(zhí)行,如果是,則返回true-s檢測文件是否為空(文件大小是否大于0),如果不為空,則返回true-e檢測文件(包括目錄)是否存在,如果是,則返回true8.3表達式與運算符布爾運算符運算符功能說明示例-a“與”運算。兩個表達式都為true才返回true[$a-lt10-a$b-gt15]返回false-o“或”運算。有一個表達式為true就返回true[$a-lt10-o$b-gt15]返回true!“非”運算。表達式值為true則返回false,否則返回true[!$a-lt10]返回true8.3表達式與運算符三目運算符語法格式
<條件表達式>?<值1>:<值2>bash使用$(())實現(xiàn)三目運算。三目運算示例
cxz@linuxpc1:~$echo$((10>5?2:4))2Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.4流程控制語句多命令的組合執(zhí)行使用邏輯與符號“&&”連接多條命令命令1&&命令2使用邏輯或符號“||”連接多條命令命令1||命令2聯(lián)合使用符號“&&”和“||”命令1&&命令2||命令3命令1||命令2&&命令3使用括號()組合多條命令
8.4流程控制語句分支結(jié)構(gòu)if語句if...else語句
if[條件表達式]then
語句序列
fiif...else...fi語句
if[條件表達式] then
語句序列1 else
語句序列2 fiif...elif...fi語句
if[條件表達式1] then
語句序列1 elif[條件表達式2] then
語句序列2 elif[條件表達式3] then
語句序列3 …… else
語句序列n fi8.4流程控制語句分支結(jié)構(gòu)case語句case值in模式1) 語句序列1
;;模式1) 語句序列2
;;
……模式n)
語句序列n
;;*)
其他語句序列esac8.4流程控制語句循環(huán)結(jié)構(gòu)循環(huán)語句while循環(huán)語句while測試條件do
語句序列doneuntil循環(huán)語句
until測試條件do
語句序列donefor循環(huán)語句
for變量[in列表]do
語句序列done其他循環(huán)語句break語句用來終止一個重復(fù)執(zhí)行的循環(huán)break[n]continue語句跳過循環(huán)體中位于它后面的語句
continue[n]exit語句用來退出一個Shell程序并設(shè)置退出值
exit[n]Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.5函數(shù)函數(shù)的定義和調(diào)用函數(shù)定義Shell函數(shù)必須先定義后使用。
[function]函數(shù)名() {
命令序列
[return返回值]函數(shù)調(diào)用調(diào)用函數(shù)只需要給出函數(shù)名,不需要加括號,就像一般命令那樣使用。函數(shù)名參數(shù)1參數(shù)2……參數(shù)n8.5函數(shù)函數(shù)的返回值使用全局變量先定義一個變量,用來接收函數(shù)的計算結(jié)果,腳本在需要的時候訪問這個變量來獲得函數(shù)的返回值。使用變量要注意不要修改父腳本里不期望被修改的內(nèi)容。在函數(shù)中使用標準輸出將一個Shell函數(shù)作為一個子程序調(diào)用(命令替換),將返回值寫到子程序的標準輸出。在函數(shù)中使用return返回整數(shù)值$?是一個特殊的內(nèi)部變量,可用于獲取上一個命令執(zhí)行后的返回結(jié)果,可以直接通過函數(shù)return語句來接收返回值。8.5函數(shù)函數(shù)參數(shù)在Shell中調(diào)用函數(shù)時可以向其傳遞參數(shù)。與腳本一樣,在函數(shù)體內(nèi)部也是通過$n的形式來獲取參數(shù)的值。$1表示第一個參數(shù)。$2表示第二個參數(shù)。Shell變量Shell編程基本步驟表達式與運算符流程控制語句函數(shù)Shell正則表達式與文本處理命令8.6Shell正則表達式與文本處理命令為什么要用正則表達式正則表達式功能檢查一個字符串是否符合指定的規(guī)則。將字符串中符合規(guī)則的內(nèi)容提取出來。Linux系統(tǒng)運維工作中使用正則表達式處理文本內(nèi)容配置文件程序源代碼命令輸出日志文件8.6Shell正則表達式與文本處理命令Shell正則表達式正則表達式的構(gòu)成一個正則表達式是由一系列字符組成的字符串,由普通字符和元字符組成。普通字符只表示它們的字面涵義。元字符是正則表達式中具有特殊意義的字符,其作用是使正則表達式具有處理能力。正則表達式的類型基本正則表達式(BasicRegularExpression,BRE)擴展正則表達式(ExtendedRegularExpression,ERE)Perl正則表達式(PerlRegularExpression,PRE)8.6Shell正則表達式與文本處理命令使用grep命令查找文本內(nèi)容語法格式grep[選項]...模式[文件]...使用BRE正則表達式的示例cxz@linuxpc1:~$grep-G"^cxz"/etc/passwdcxz:x:1000:1000:cxz,,,:/home/cxz:/bin/bash選項-e用于顯式指定正則表達式的模式,可指定多個模式cxz@linuxpc1:~$grep-e"^cxz"-e"sync$"/etc/passwdsync:x:4:65534:sync:/bin:/bin/synccxz:x:1000:1000:cxz,,,:/home/cxz:/bin/bash8.6Shell正則表達式與文本處理命令使用sed命令處理文本內(nèi)容sed命令的基本用法sed[選項]...{腳本(如果沒有其他腳本)}[輸入文件]...sed命令的子命令子命令說明a在目標行的下面新增一行或多行,后面的參數(shù)可以字符串的形式指定新增行的內(nèi)容。多行時除最后一行外,每行末尾需用“\”符號續(xù)行c替換指定行,后面的參數(shù)可以字符串的形式指定要替換的行內(nèi)容。多行時除最后一行外,每行末尾需用“\”符號續(xù)行d刪除指定行i在目標行的上面插入一行或多行,后面的參數(shù)可以字符串的形式指定插入行的內(nèi)容。多行時除最后一行外,每行末尾需用“\”符號續(xù)行p顯示指定行,通常與-n選項一起使用s替換內(nèi)容,無須指定地址范圍,通常與正則表達式配合使用!表示后面的命令對所有未被選定的行發(fā)生作用=輸出當前行號#將注釋擴展到下一個換行符之前8.6Shell正則表達式與文本處理命令使用sed命令處理文本內(nèi)容sed命令的地址行號(“$”表示最后一行正則表達式使用sed修改文本文件只有使用-i選項才可以改變文件內(nèi)容方便使用Shell腳本修改配置文件使用sed命令替換文件內(nèi)容sed[選項]...'s/原字符串/新字符串/'文件sed[選項]...'s/原字符串/新字符串/g'文件8.6Shell正則表達式與文本處理命令使用sed命令處理文本內(nèi)容在sed命令中使用正則表達式可以使用正則表達式高效實現(xiàn)復(fù)雜的查找和替換功能。sed的正則表達式使用兩個正斜杠標識。sed命令默認使用BRE,使用選項-r則可以使用ERE。示例cxz@linuxpc1:~$sed's/#.*//g'/etc/ssh/ssh_config|sed/^$/dInclude/etc/ssh/ssh_config.d/*.confHost*SendEnvLANGLC_*HashKnownHostsyesGSSAPIAuthenticationyes8.6Shell正則表達式與文本處理命令使用awk命令處理文本內(nèi)容awk命令的基本用法awk[選項]...腳本[輸入文件]...常用的awk內(nèi)置變量內(nèi)置變量說明內(nèi)置變量說明$n當前記錄的第n個字段FILENAME當前文件名$0完整的輸入記錄FS字段分隔符,默認是空格和制表符ARGC命令行參數(shù)的數(shù)目RS行分隔符,默認是換行符ARGIND命令行中當前文件的位置(從0開始算)OFS輸出字段的分隔符,默認為空格NF一條記錄的字段的數(shù)目ORS輸出記錄的分隔符,默認為換行符NR已經(jīng)讀出的行數(shù),從1開始OFMT數(shù)字輸出的格式,默認為%.6g8.6Shell正則表達式與文本處理命令使用awk命令處理文本內(nèi)容awk命令的自定義變量-v變量名=變量值awk命令的運算符算術(shù)運算符賦值運算符關(guān)系運算符邏輯運算符正則運算符輸出操作命令print的參數(shù)可以是變量、數(shù)值或者字符串printf命令的用法和C語言中的printf基本相似8.6Shell正則表達式與文本處理命令使用awk命令處理文本內(nèi)容awk命令的函數(shù)awk命令提供一些內(nèi)置函數(shù)split()——將字符串分隔后保存至
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽理工大學(xué)《產(chǎn)品創(chuàng)新設(shè)計》2021-2022學(xué)年第一學(xué)期期末試卷
- 合同到期了單位不續(xù)簽通知模板
- 2024年拉薩駕駛員客運資格證模擬考試題及答案詳解
- 2024簡單版機動車借款抵押合同
- 2024服裝制作合同
- 2024防水材料采購合同
- 2024深圳建設(shè)工程技術(shù)咨詢合同樣本
- 2024光伏發(fā)電安裝合同范本光伏發(fā)電安裝合同范本
- 2024教師聘用合同
- 2024幼兒園裝修改造工程施工合同
- 幼兒園繪本故事:《老虎拔牙》 課件
- 2021年上半年《系統(tǒng)集成項目管理工程師》真題
- 一個冬天的童話 遇羅錦
- GB/T 706-2008熱軋型鋼
- 實驗六 雙子葉植物莖的初生結(jié)構(gòu)和單子葉植物莖的結(jié)構(gòu)
- GB/T 25032-2010生活垃圾焚燒爐渣集料
- GB/T 13610-2020天然氣的組成分析氣相色譜法
- 《彩虹》教案 省賽一等獎
- 2023年湖南建筑工程初中級職稱考試基礎(chǔ)知識
- 沈陽機場航站樓擴建工程安裝施工組織設(shè)計
- 司法考試:證據(jù)法
評論
0/150
提交評論