版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章Shell編程入門Linux系統(tǒng)管理與服務(wù)器配置——基于CentOS7目錄8.1項目一:第一個Shell程序Helloworld 8.1.1創(chuàng)建Shell程序 8.1.2設(shè)置執(zhí)行權(quán)限 8.1.3執(zhí)行Shell程序 8.2項目二:猜數(shù)字游戲程序8.2.1Shell的語法介紹 8.2.2輸入/輸出內(nèi)部命令 8.2.3條件測試 8.2.4流程控制語句 8.2.5函數(shù) 8.2.6處理參數(shù) 8.2.7調(diào)試Shell程序 8.3Shell程序設(shè)計實例 本章小結(jié)8.1項目一:第一個Shell程序HelloworldShell編程的初學者使用guestuser1賬號登錄系統(tǒng),在Linux環(huán)境下編寫第一個Shell程序first,在屏幕上輸出“Helloworld”。序號知識點詳見章節(jié)1創(chuàng)建Shell程序8.1.12設(shè)置執(zhí)行權(quán)限8.1.23執(zhí)行Shell程序8.1.38.1.1創(chuàng)建Shell程序與DOS系統(tǒng)中的批處理文件類似,Linux系統(tǒng)中的腳本文件(Shell程序)是一個文本文件,包含各類Shell命令。通過腳本文件,Shell命令匯集在一起被連續(xù)執(zhí)行。與高級程序設(shè)計語言類似,Shell也提供了輸入/輸出、流程控制等命令。8.1.1創(chuàng)建Shell程序8.1項目中創(chuàng)建Shell程序的步驟:$cd$mkdirbin//在用戶工作目錄中創(chuàng)建一個保存腳本的子目錄bin。$cdbin//切換到bin目錄中。$vimfirst//使用vim命令編寫名為first的腳本,該腳本程序保存到bin目錄中。#!/bin/sh#告訴系統(tǒng),該文件的代碼將用/bin/sh來執(zhí)行。VAR="Helloworld"#給變量var定義了一個字符串值。echo$VAR#將變量var的值顯示輸出到終端。8.1.2設(shè)置執(zhí)行權(quán)限通常要執(zhí)行腳本文件,需要為腳本文件設(shè)置執(zhí)行權(quán)限??梢允褂靡韵旅钔瓿蓪irst腳本文件權(quán)限的設(shè)置:$chmodu+xfirst上面的命令只是給文件所有者設(shè)置執(zhí)行權(quán)限。如果同組用戶或者其他用戶也需要執(zhí)行該腳本文件,可使用以下命令設(shè)置權(quán)限:$chmoda+xfirst注意:Linux中的腳本文件與DOS或Windows中的批處理程序不同,不能通過擴展名來識別,即不可為腳本文件設(shè)置任意擴展名,而必須通過為腳本文件添加執(zhí)行權(quán)限來允許其執(zhí)行。8.1.3執(zhí)行Shell程序執(zhí)行腳本文件的方式有多種,這里介紹兩種方法:使用Shell程序執(zhí)行和直接執(zhí)行。1.使用Shell程序執(zhí)行腳本文件是使用文本文件格式保存的,可通過/bin目錄中名為sh的程序進行解釋執(zhí)行。以這種方式執(zhí)行腳本文件時,不需要設(shè)置腳本文件的可執(zhí)行權(quán)限。例如,8.1項目中的腳本,可使用以下命令執(zhí)行:$shfirst這種方式實際上是調(diào)用一個新的bash程序,將Shell程序文件名作為參數(shù)傳遞給新的bash程序。使用這種方法的優(yōu)點是可以利用Shell程序的調(diào)試功能。8.1.3執(zhí)行Shell程序2.直接執(zhí)行執(zhí)行腳本文件更常用的方式是直接執(zhí)行,即在Shell提示符后面輸入腳本文件名即可。要用這種方式執(zhí)行腳本文件,需首先設(shè)置該文件的執(zhí)行權(quán)限。例如,執(zhí)行8.1項目中的腳本,可使用以下命令執(zhí)行:$./first在Shell提示符后面輸入腳本文件名進行執(zhí)行時,系統(tǒng)將首先在設(shè)置的搜索路徑中查看指定的文件名,找到就開始執(zhí)行,若未找到,最后將顯示錯誤提示。如果執(zhí)行當前目錄下的腳本文件,通常使用一個點表示當前目錄,如執(zhí)行當前目錄中的腳本文件test,可使用命令:$./test。8.1項目一:第一個Shell程序Helloworld操作過程:$cd$mkdirbin$cdbin$vimfirst#!/bin/shVAR="Helloworld"echo$VAR$chmoda+xfirst$./first8.2項目二:猜數(shù)字游戲程序為了更深入的學習Shell編程,在Linux環(huán)境下編寫一個猜數(shù)字的小游戲。游戲規(guī)則如下:首先程序隨機生成一個60以內(nèi)的整數(shù),然后等待用戶的輸入。如果用戶輸入的是一個整數(shù)則轉(zhuǎn)到下一步,否則顯示錯誤提示信息并重新輸入。如果用戶輸入的整數(shù)比隨機數(shù)大,程序提示“Toolarge!”。如果用戶輸入的整數(shù)比隨機數(shù)小,程序提示“Toosmall!”。如果用戶輸入的整數(shù)與隨機數(shù)相等,程序提示“Guessed,youareclever!”。8.2項目二:猜數(shù)字游戲程序序號知識點詳見章節(jié)1Shell語法介紹8.2.12輸入/輸出命令8.2.23條件測試8.2.34流程控制語句——分支/循環(huán)8.2.45函數(shù)的定義與使用8.2.56命令行參數(shù)的處理8.2.67Shell程序調(diào)試8.2.78.2.1Shell的語法介紹1.環(huán)境變量指與Shell執(zhí)行的環(huán)境相關(guān)的一些變量。環(huán)境變量在Shell啟動時就已定義好,用戶也可以重新定義。要查看系統(tǒng)中的各環(huán)境變量,可使用set命令。常用的環(huán)境變量HOME:登錄用戶工作目錄的完全路徑名。
LOGNAME:當前用戶名。PATH:用冒號分隔的目錄搜索路徑。Shell執(zhí)行命令時,將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執(zhí)行文件將被執(zhí)行。PSI:系統(tǒng)提示符,系統(tǒng)管理員的提示符為“#”,而普通用戶的提示符是“$”。PWD:當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。
UID:當前用戶的標識符,取值是由數(shù)字構(gòu)成的字符串。8.2.1Shell的語法介紹2.自定義變量戶自定義變量的最簡單格式如下:變量名=變量值若要定義一個只讀變量,則使用以下格式:readonly變量名=變量值只讀變量的值在后面的代碼中不允許被修改。通過上面方式定義的變量都只是當前Shell的局部變量,因此,不能被在Shell中運行的其他命令或Shell程序訪問(該變量只能在當前代碼文件中使用)。若要定義全局變量,可使用以下格式:export變量名=變量值全局變量在以后運行的所有命令或程序中都可以被訪問。8.2.1Shell的語法介紹3.引用變量在Shell程序中引用環(huán)境變量或自定義變量,可使用以下格式:$變量名即在變量名前加上一個“$”符號。在8.2項目中就是用$PRICE、$NUM方式來引用變量進行比較運算的。8.2.1Shell的語法介紹4.預定義變量系統(tǒng)的預定義變量與前面介紹的環(huán)境變量相似,也是在Shell啟動時就定義好的。與環(huán)境變量不同的是,用戶不能修改預定義變量,只能引用這些變量。所有預定義變量都是由“$”符號和另個符號組成的,常用的S預定義變量有:$#:位置參數(shù)的數(shù)量。$*:所有位置參數(shù)的內(nèi)容。$?:命令執(zhí)行后返回的狀態(tài)。$$:當前進程的進程號。$!:后臺運行的最后一個進程號。$0:當前執(zhí)行的進程名。8.2.2輸入/輸出內(nèi)部命令1.echo使用echo命令可顯示Shell程序的執(zhí)行情況。命令格式:echo參數(shù)echo命令將跟隨其后的內(nèi)容顯示在終端上。若echo之后的內(nèi)容是一個字符串,則直接顯示這些字符;若echo命令后面的參數(shù)中包含變量,則將顯示變量的內(nèi)容,而不是變量名稱。2.read使用read命令可接收用戶輸入的字符串。命令格式:read變量名列表該命令從標準輸入中讀入一行,分解儲層若干部分,分別復制給read命令后面的變量名列表中各對應(yīng)的變量。8.2.2輸入/輸出內(nèi)部命令〖例8.1〗編寫一個Shell程序,接收用戶輸入的用戶名和電話號碼,然后將這些信息顯示在終端上,并保存到contact.txt文件中。8.2.3條件測試1.測試命令的執(zhí)行結(jié)果執(zhí)行任何Linux命令都可能存在兩種狀態(tài):正確或錯誤。若前一條命令正確執(zhí)行,則返回的狀態(tài)值為0:若返回值為非0值,則表示執(zhí)行命令出錯。使用預定義變量“$?”可返回命令執(zhí)行后的狀態(tài)。在Shell程序中可以根據(jù)預定義變量“$?”的值,來判斷前一條命令執(zhí)行是否正確。8.2.3條件測試2.測試文件的狀態(tài)在Shell程序中,測試某個文件的狀態(tài)時,通常使用以下格式[測試表達式]注意:在上面的格式中,中括號“[]”與測試表達式之間必須有一個空格來分隔。測試文件狀態(tài)可使用以下參數(shù)。-e文件名:若文件存在,返回真。-r文件名:若文件存在且可讀,返回真。-w文件名:若文件存在且可寫,返回真。-x文件名:若文件存在且可執(zhí)行,返回真。-s文件名:若文件存在且至少有一個字符,返回真。-d文件名:若文件存在且是目錄,返回真。-f文件名:若文件存在且為普通文件,返回真。-c文件名:若文件存在且為字符型特殊文件,返回真。-b文件名:若文件存在且為塊特殊文件,返回真。8.2.3條件測試〖例8.2〗編寫測試文件的Shell程序,判斷用戶輸入的文件名是否為目錄,若是目錄,則輸出“Directory!”;若不是目錄,則輸出“NotDirectory!”。8.2.3條件測試3.測試數(shù)據(jù)的值在進行數(shù)據(jù)值判斷時,可使用以下參數(shù)來測試數(shù)據(jù)值的狀態(tài)。-eq:判斷是否相等,與高級程序設(shè)計語言中的“==”類似。-ne:判斷是否不相等,與高級程序設(shè)計語言中的“!=”或“<>”類似。-gt:判斷是否大于,與高級程序設(shè)計語言中的“>”類似。-ge:判斷是否大于或等于,與高級程序設(shè)計語言中的“>=”類似。-lt:判斷是否小于,與高級程序設(shè)計語言中的“<”類似。-le:判斷是否小于或等于,與高級程序設(shè)計語言中的“<=”類似。8.2.3條件測試4.測試字符串在進行字符串判斷時,可使用以下參數(shù)來判斷字符串的狀態(tài)。=:判斷兩個字符串是否相等。!=:判斷兩個字符串是否不等。-z字符串:若字符串長度為0,返回真。-n字符串:若字符串長度不為0,返回真。8.2.3條件測試5.邏輯操作符如果有多個測試條件,還可以使用邏輯操作符來進行連接,邏輯操作符有以下3個。!:邏輯非操作符,對已有邏輯值取反。-a:邏輯與操作符(and),當兩個測試條件都成立時,才返回真。-o:邏輯或操作符(or),,只要兩個測試條件中有一個條件成立,就返回真。當多個邏輯操作符同時出現(xiàn)在測試條件時,其優(yōu)先級為“!”最高、“-a”次之、“-o”最低。8.2.4流程控制語句1.if-else條件語句通過if-else條件語句來進行程序的分支流程控制,該語句的一般格式如下:if條件測試命令串then
條件為真時執(zhí)行的命令else
條件為假時執(zhí)行的命令fi從以上格式可看出,Shell與其他高級程序設(shè)計語言不同,then需要另起一行來書寫,若需要與if寫在同一行,則需要在“條件測試命令串”右側(cè)添加一個分號(;),以如下形式來使用:8.2.4流程控制語句2.if-elif-else條件語句對于多分支的情況,可以使用if條件語句的嵌套來完成,,該語句的一般格式如下:if條件測試命令串1then
條件1為真時執(zhí)行的命令elif條件測試命令串2then
條件2為真時執(zhí)行的命令......elif條件測試命令串nthen
條件n為真時執(zhí)行的命令else
條件n為假時執(zhí)行的命令fi8.2.4流程控制語句3.case條件語句。case條件語句可從多個分支中選擇一個分支來執(zhí)行,該語句的格式如下:case條件測試命令串in表達式1)
分支1執(zhí)行的命令;;表達式2)
分支2執(zhí)行的命令......表達式n)
分支n執(zhí)行的命令;;*)
其他命令esac8.2.4流程控制語句〖例8.3〗編寫Shell程序,判斷文件的類型。Linux中的文件與DOS中不太一樣,DOS中的大部分文件可通過擴展名來識別類型,但Linux中的文件,如可執(zhí)行文件,可以沒有擴展名,要求編寫程序,判斷用戶輸入的文件類型。8.2.4流程控制語句3.for循環(huán)語句對于一些需要反復執(zhí)行的命令,可使用循環(huán)語句來控制。for循環(huán)語句就是一個常用的循環(huán)語句。for循環(huán)對每一個變量可能的值循環(huán)執(zhí)行一個命令串。賦給變量的幾個數(shù)值既可以在程序內(nèi)以數(shù)值列表的形式提供,也可以在程序以外用位置參數(shù)的形式提供。該語句的格式如下:for變量名[in數(shù)值列表]do
循環(huán)執(zhí)行的命令串done在上面的結(jié)構(gòu)中,變量名可由用戶進行設(shè)置,變量將逐個從“in數(shù)值列表”中取出值,參與“循環(huán)執(zhí)行的命令串”中的操作。8.2.4流程控制語句〖例8.4〗在使用ls命令查看當前工作目錄的文件名列表時,將在一行中顯示多個文件名。要求編寫Shell程序,將每一個文件名顯示在一行中。
8.2.4流程控制語句4.while和until循環(huán)語句while和until循環(huán)都用于不斷地重復執(zhí)行一系列命令,也可從輸入文件中讀取數(shù)據(jù)。通過命令的返回狀態(tài)值來控制循環(huán)。while循環(huán)語句的格式如下:While循環(huán)條件命令串do
循環(huán)執(zhí)行的命令串done在while語句中,只要“循環(huán)條件命令串”的返回狀態(tài)為真,while循環(huán)就繼續(xù)執(zhí)行,直到“循環(huán)條件命令串”的返回狀態(tài)為假,退出循環(huán)?!祭?.5〗使用while循環(huán)編寫Shell程序,計算1-9的平方。8.2.4流程控制語句until循環(huán)語句的格式如下:until循環(huán)條件命令串do循環(huán)執(zhí)行的命令串doneuntil循環(huán)語句和while循環(huán)語句基本相同,兩者的區(qū)別在于,while循環(huán)在條件為真時繼續(xù)執(zhí)行循環(huán),而until循環(huán)則是在條件為假時繼續(xù)執(zhí)行循環(huán)。8.2.4流程控制語句5.break和continue語句在循環(huán)執(zhí)行的命令串中,有時可能需要根據(jù)條件退出循環(huán)或跳過一些循環(huán)步,這時可使用break和continue語句。使用break語句,可立即終止當前循環(huán)的執(zhí)行;使用contiune語句,可不執(zhí)行循環(huán)后面的語句,立即開始下一次循環(huán)的執(zhí)行。這兩條語句只有放在循環(huán)語句的do和done之間才有效。8.2.5函數(shù)在Shell中,允許將一組命令集或語句組成一個可重復使用的塊,這些塊成為Shell函數(shù)。函數(shù)定義的基本格式為:函數(shù)名(){
命令串}8.2.6處理參數(shù)1.位置參數(shù)調(diào)用Shell程序時,除輸入Shell程序文件名外,還可以在后面跟上多個參數(shù)。由于參數(shù)與在命令行中的位置有關(guān),因此稱為位置參數(shù)。各位置參數(shù)之間用空格分隔,用$1表示第1個參數(shù),$2表示第2個參數(shù),以此類推。而$0是一個特殊的變量,其內(nèi)容是當前Shell程序的文件名。當有多個位置參數(shù)時,可以使用shift命令來逐個向左移動參數(shù)。這樣,通過移動參數(shù),程序中只需使用$1就可以逐個訪問所有位置的參數(shù)?!祭?.6〗編寫Shell程序,要求程序逐個處理傳入的位置參數(shù)。8.2.6處理參數(shù)2.函數(shù)參數(shù)向函數(shù)傳遞參數(shù)與給一般腳本文件傳遞參數(shù)一樣,使用預定義變量$1~$9來傳遞參數(shù)。函數(shù)取得所傳參數(shù)后,將原始參數(shù)傳回Shell腳本文件。在函數(shù)定義時不用帶參數(shù)說明,在調(diào)用函數(shù)時直接傳遞參數(shù)即可?!祭?.7〗編寫一個求累加和的函數(shù),該函數(shù)將所有參數(shù)的值進行累加。8.2.7調(diào)試Shell程序1.一般錯誤由于Shell程序沒有一個集成的開發(fā)環(huán)境,在一般的文本編輯器(如vim)中輸入程序代碼,編輯器并不會對語法進行檢查,因此,輸入代碼時經(jīng)常會出現(xiàn)各種輸入性錯誤。下面是一些常見的錯誤情況。輸入錯誤:如輸入錯誤關(guān)鍵字、大量的符號漏輸入一部分等。字母大小寫錯誤:在Linux中,對大小寫字母是嚴格區(qū)分的,輸入時容易出錯。Shell中所有關(guān)鍵字都用小寫字母表示,建議變量名使用大寫字母組合來表示。循環(huán)錯誤:由于Shell中的循環(huán)控制語句與一般高級程序設(shè)計語言有所不同,輸入結(jié)構(gòu)時容易出錯。8.2.7調(diào)試Shell程序2.調(diào)試跟蹤在Shell中,可通過執(zhí)行sh命令的方式來調(diào)試Shell程序,從而對程序的執(zhí)行過程進行跟蹤。sh命令中主要通過兩個選項(-v和-x)來跟蹤Shell程序的執(zhí)行。(1)v選項sh命令的-v選項使Shell在執(zhí)行程序過程中,將讀入的每一個命令行原樣輸出到終端。(2)-x選項sh命令的-x選項使Shell在執(zhí)行程序過程中,在執(zhí)行的每一個命令行首用一個“+”號加上對應(yīng)的命令顯示在終端上,并把每一個變量和該變量的值也顯示出來。8.2項目二:猜數(shù)字游戲程序$vimguess//編寫名為guess的腳本文件。#!/bin/shNUM=$((RANDOM%61))#生成60以內(nèi)的隨機數(shù)。echo"Theansweris$NUM"echo"======================="usleep1000000input(){#定義input函數(shù)。read-p"Pleaseenteryournumber:"PRICEexpr$PRICE+1&>/dev/nullif[$?-ne0]#判斷輸入的值是否為整數(shù)。thenecho"Pleaseenteraninteger!"#提示錯誤信息。input#調(diào)用input函數(shù)重新輸入。fi}8.2項目二:猜數(shù)字游戲程序guess(){#定義guess函數(shù)。if[$PRICE-eq$NUM];then#判斷輸入的PRICR與隨機數(shù)NUM是否相等。echo"Guessed,youareclever!"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024路面鋪裝工程測量與放樣服務(wù)合同
- 2025年度智慧社區(qū)物業(yè)管理服務(wù)合同規(guī)范文本3篇
- 2025年度殯葬墓地銷售及售后服務(wù)協(xié)議書3篇
- 2025年度數(shù)據(jù)中心建設(shè)承包合同參考范文4篇
- 2025年度智能車位共享平臺代理銷售合同模板4篇
- 2024栽樹合同范本:生態(tài)濕地栽樹項目合同3篇
- 2025年度智能儲藏室資產(chǎn)交易合同4篇
- 2025年度智能化倉儲儲藏室租賃及運營管理協(xié)議范本4篇
- 2025年度醫(yī)療設(shè)備代工制造合同4篇
- 2025年度個人車輛購置稅連帶擔保協(xié)議4篇
- GB/T 11072-1989銻化銦多晶、單晶及切割片
- GB 15831-2006鋼管腳手架扣件
- 有機化學機理題(福山)
- 醫(yī)學會自律規(guī)范
- 商務(wù)溝通第二版第4章書面溝通
- 950項機電安裝施工工藝標準合集(含管線套管、支吊架、風口安裝)
- 微生物學與免疫學-11免疫分子課件
- 《動物遺傳育種學》動物醫(yī)學全套教學課件
- 弱電工程自檢報告
- 民法案例分析教程(第五版)完整版課件全套ppt教學教程最全電子教案
- 7.6用銳角三角函數(shù)解決問題 (2)
評論
0/150
提交評論