信創(chuàng)Linux操作系統(tǒng)管理(統(tǒng)信UOS版)項目七 shell編程_第1頁
信創(chuàng)Linux操作系統(tǒng)管理(統(tǒng)信UOS版)項目七 shell編程_第2頁
信創(chuàng)Linux操作系統(tǒng)管理(統(tǒng)信UOS版)項目七 shell編程_第3頁
信創(chuàng)Linux操作系統(tǒng)管理(統(tǒng)信UOS版)項目七 shell編程_第4頁
信創(chuàng)Linux操作系統(tǒng)管理(統(tǒng)信UOS版)項目七 shell編程_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

項目七Shell編程【項目場景】

小明負(fù)責(zé)所在公司的服務(wù)器運維工作,在工作中需要涉及服務(wù)器上的任務(wù)部署,為了避免人為因素導(dǎo)致誤操作,并且在遇到故障時可以方便復(fù)盤,決定使用Shell腳本的方式來控制質(zhì)量?!卷椖磕繕?biāo)】知識目標(biāo)

知道Shell是什么知道變量和環(huán)境變量知道Shell有哪些基本語句技能目標(biāo)學(xué)會設(shè)置環(huán)境變量學(xué)會使用shell語句實現(xiàn)功能素質(zhì)目標(biāo)具有主動學(xué)習(xí)知識的意識具有發(fā)現(xiàn)問題、分析問題和解決問題的能力具有較強的團隊協(xié)作能力培養(yǎng)精益求精、密益求密的工作態(tài)度培養(yǎng)認(rèn)真負(fù)責(zé)、善于思考總結(jié)的工作作風(fēng)主要內(nèi)容任務(wù)一Shell腳本概述任務(wù)三循環(huán)語句的使用任務(wù)二條件語句的使用任務(wù)四函數(shù)的使用任務(wù)五輸入輸出重定向的使用任務(wù)一Shell腳本概述一、Shell概述Shell是用C語言編寫的用戶和Linux內(nèi)核之間的接口程序,是用戶與Linux的橋梁。計算機只能識別0和1的指令,我們輸入的命令要被轉(zhuǎn)換成代碼“0”和“1”,Shell就是用來實現(xiàn)這種轉(zhuǎn)換的。轉(zhuǎn)換成功后,Linux內(nèi)存用0和1代碼來控制硬件。因此,Shell是和Linux內(nèi)核交互的界面。同時,Shell是解釋性腳本語言,支持大多數(shù)的高級語言可以見到的程序元素,如函數(shù)、變量、數(shù)組、流程結(jié)構(gòu)等,其功能強大,易于編寫與調(diào)試,靈活性強。在提示符界面中能輸入的命令,都能放在可執(zhí)行的Shell腳本程序中作為語句來使用。Shell是操作系統(tǒng)的最外層,可以合并編程語言來控制進(jìn)程和文件,是負(fù)責(zé)User與LinuxOS之間溝通的橋梁,如圖所示。它為用戶提供一個操作界面,User在這個界面輸入指令,其實就是通過Shell向LinuxKernel傳遞過去,因此Shell也叫解釋器。Shell與用戶、內(nèi)核的關(guān)系1.管道兩個或多個進(jìn)程之間需要通信時,由于它們擁有自己的地址空間,因此必須有一塊公共的空間,而這塊空間就需要內(nèi)核提供,也就是緩沖區(qū)。管道有兩端,分別負(fù)責(zé)輸入和輸出,因此管道用于連接兩個進(jìn)程。進(jìn)程1將數(shù)據(jù)輸入緩沖區(qū),進(jìn)程2將緩沖區(qū)的數(shù)據(jù)取出來,從而實現(xiàn)兩個進(jìn)程的通信。管道的符號是“|”,其使用方法如下:$ls-l/dev|wc-l #統(tǒng)計系統(tǒng)設(shè)備目錄dev下的文件和目錄數(shù)量$cat/etc/passwd|grep"root:"|wc-l#統(tǒng)計文件/ect/passwd內(nèi)包含root的行數(shù)2.tee命令tee命令輸出到標(biāo)準(zhǔn)輸出的同時,追加到文件file中。如果文件不存在,則創(chuàng)建文件;如果文件已經(jīng)存在,則默認(rèn)覆蓋,其命令格式如下:tee[-a][files](1)-a:指定追加方式,默認(rèn)采用覆蓋的方式;(2)-i:用于無法中斷命令(Ctrl+C)。tee命令的使用示例如下:$cal|teecalendar #將當(dāng)月日歷表顯示到屏幕上,同時保存到calendar$ls/|teef1f23.引號機制與變量替換在Shell用三類引號:單引號(’)、雙引號(”)和反單引號(`),單引號和雙引號用于變量定義,反單引號用于命令替換。(1)單引號引用的字符為普通字符,特殊字符被單引號引用會失去原來的意義。$string='$PATH' 定義string變量并賦值$echo$string 顯示變量值:’$PATH’(2)反向單引號的作用是命令替換。命令替換是指執(zhí)行反單引號內(nèi)的命令,并將執(zhí)行結(jié)果返回。$

echoIam`whoami`andworkingin`pwd`輸出

I

amrootand

working

in

/root(3)雙引號用來定義變量,與單引號不同之處在于在雙引號中間可以進(jìn)行變量替換和命令替換。雙引號內(nèi)的特殊字符仍具有特殊意義。$myname=`whoami` #通過命令替換定義變量myname##定義變量myself。注意使用了變量替換和命令替換$myself="Iamastudent,myunameis$mynameandmyworkis`pwd`"$myself2="Iamastudent,myunameis\"$myname\"andmyworkis\"`pwd`\""echomyselfechomyself26.特殊字符Shell中除了可以使用普通鍵盤輸入的字符,還有一些具有特殊含義和功能的特殊字符。在使用它們時,應(yīng)注意其特殊的含義和作用范圍。1)白空格在統(tǒng)信UOS系統(tǒng)中,空格和Tab被稱為白空格(WhiteSpace),主要用于命令行中命令名、參數(shù)及選項的分隔。在特殊情況下,白空格中也可包含回車字符。2)通配符通配符是路徑擴展(英文pathnameexpansion,或者是文件名擴展(filenameexpansion))功能中的模式匹配(patternmatching)功能,比如文件名配對、路徑名搜索、字符串查找等。常用的通配符有“*”,“?”和括在方括號“[set]”中的字符集合。通配符的具體含義二、Shell命令1.命令格式用戶登錄系統(tǒng)后,在字符界面下可以看到一個Shell的提示符,用戶可以在提示符后面輸入命令和參數(shù)。例如$date$date-u在命令行中必須先輸入一個命令名,后面的內(nèi)容則為分隔符隔開的選項或參數(shù)。命令名[選項…][參數(shù)…]2.提示符和分隔符在統(tǒng)信UOS系統(tǒng)中,默認(rèn)情況下,root用戶的提示符是“#”,普通用戶的提示符為“$”;分隔符為白空格。3.選項和參數(shù)參數(shù)是命令操作的對象,而選項用于影響對對象的操作行為,一般選項是由“-”字符引導(dǎo)的字符或字符串。在統(tǒng)信UOS中,選項有兩種風(fēng)格:一是傳統(tǒng)的Unix風(fēng)格,以“-”開始,后面跟著一個字符;另一種是GNU風(fēng)格的選項,以“--”開始,后面跟著關(guān)鍵字或“-”跟著完整的英文單詞??紤]常用習(xí)慣原因,本書介紹和使用傳統(tǒng)的UNIX風(fēng)格的選項,兩種風(fēng)格的選項使用如下: $date #默認(rèn)方式輸出時間 $date-u #傳統(tǒng)的UNIX風(fēng)格 $date--uct #GNU的風(fēng)格選項 $date-universal #同上 ##顯示文件/dev信息 $ls-l/dev #默認(rèn)模式或者傳統(tǒng)UNIX風(fēng)格 $ls-n/dev #使用傳統(tǒng)UNIX模式選擇 $ls-l–numeric–uid-gid/dev #傳統(tǒng)和UNIX和GUN風(fēng)格混合使用 $ls-ln–time-style=ios/dev #同上4.命令行編輯特性1)命令和文件名擴展bash命令行具有命令和文件名擴展特性。當(dāng)用戶輸入一個沒有完成的命令或文件名時,只需按Tab鍵就能使用命令和文件名拓展特性,系統(tǒng)自動完成該命令的剩余輸入。如果有多個命令或文件的前綴相同,bash將會顯示前綴相同的文件,提供用戶去查看,以方便用戶輸入,用戶按回車鍵后,系統(tǒng)將執(zhí)行這條命令。當(dāng)備選文件名不唯一時,按下Tab鍵后,bash在補齊最大可能長度后響鈴,若此時用戶兩次按下Esc鍵,bash將列出所有與輸入的字符串匹配的文件名供用戶選擇,然后用戶在輸入少量可以區(qū)分文件名的字符后,再按Tab鍵補全命令行。2)命令行編輯bash允許用戶對正在輸入的命令行進(jìn)行編輯。編輯時除了可使用→、←、↑、↓、Home、End、Page

UP、Page

Down、Delete

和Backspace鍵進(jìn)行修改,還可使用命令行編輯快捷鍵。3)歷史記錄在bash中,用戶按Enter鍵后命令行被保留在歷史記錄文件中,按↑或↓鍵在歷史記錄中查找,對出現(xiàn)的“當(dāng)前記錄”可以進(jìn)行編輯和使用。利用這一功能可以執(zhí)行以前執(zhí)行過的命令,不需要重新輸入該命令。在Linux系統(tǒng)中每條執(zhí)行過的命令都保存在~/.bash_history目錄下,文件內(nèi)保存了1000條歷史記錄,每一條記錄都有一個編號,用history命令列出所有歷史記錄。5.Shell命令執(zhí)行1)命令搜索當(dāng)用戶從鍵盤輸入一個命令時,Shell首先會檢查是否帶有路徑(PATH)。如果有路徑可以直接搜索它,如果找到就執(zhí)行;否則就報錯(提示用戶命令找不到命令或命令不存在)。2)命令的返回值Linux系統(tǒng)默認(rèn)約定,Shell命令在結(jié)束時向調(diào)用者返回一個返回值,來表示是否成功,成功為0,不成功非0,當(dāng)命令是由管道連接的命令串或命令組時,最后執(zhí)行的命令的返回值作為整個命令串的返回值。用戶可以通過$?訪問返回值。$ls/dev/sd* #執(zhí)行命令,顯示系統(tǒng)中的SCSI的設(shè)備$echo$? #顯示返回值輸出為0,表示/dev目錄內(nèi)有SCSI硬盤設(shè)備,而命令為:ls/dev/|grep‘^hd’;echo$?將輸出非0(這邊為1),表示系統(tǒng)沒有IDE設(shè)備。三、Shell的變量在統(tǒng)信UOS下使用bash的Shell內(nèi)核。Shell腳本有一套相對完善的語法規(guī)則,包括變量、數(shù)組的定義與使用、函數(shù)的構(gòu)造及流程控制等。在Linux系統(tǒng)中,用戶可以定義自己想要的變量,定義變量后變量的用法和其他語言一樣可以被調(diào)用,在調(diào)用變量的時候需要用“$”作為變量名的前導(dǎo)符。定義變量的方法如下:var_name=var_value定義和使用方法如下:$x=18 #定義數(shù)值變量,$y='Iamastudent' #定義一個字符串y,其值為Iamastudent$echo$x$y$HOME #顯示用戶定義變量x,y和環(huán)境變量的HOME$z="$y,Iam$x" #由變量x和定義變量z,其值為’Iamastudent,Iam18’Shell是解釋型語言,不需要定義變量類型,根據(jù)用戶輸入來確定變量類型。1.變量的定義Shell中的變量在使用之前不需要定義,且沒有細(xì)致的分類,可以在使用的時候創(chuàng)建。Shell變量名由字母、數(shù)字和下劃線組成,開頭只能是字母或下劃線。給變量賦值時,等號兩邊不能有空格,其格式如下:變量名=值若要給變量賦空值,可在等號后跟一個換行符,即缺省以上格式中“值”的部分;若字符串中包含空格,則必須將值放在引號(單引號或雙引號)中。例如定義一個值為helloworld的變量var,可以使用以下格式:var=’helloworld’var=”helloworld”Shell中可以使用readonly將某個變量設(shè)置為只讀變量,使用方法如下:readonly變量名如要將上面定義的變量var設(shè)置為只讀,可以使用以下方法:readonlyvar此時若要重新為變量var賦值,則會提示var:isreadonly。在Shell腳本的函數(shù)中,在變量前添加關(guān)鍵字local,該變量則為局部變量。2.變量的引用Shell中使用$符號來引用變量,若要輸出上文定義的變量,可以使用以下方式:echo$var在定義時,使用雙引號或單引號來標(biāo)注變量皆可,但是在引用時,其效果略有差異。若由雙引號引起來的字符串中有變量的引用,則會輸出變量中存儲的值;若由單引號引起來的字符串中有變量的引用,則會原樣輸出。例如,在Shell腳本var中定義變量并引用:#!/bin/shvar=“HelloWorld!”echo$varecho“$var”echo‘$var’exit0執(zhí)行結(jié)果如下:$shvarHelloWorld!HelloWorld!$var3.變量的輸入Shell腳本中通過echo關(guān)鍵字打印變量,通過read關(guān)鍵字讀取變量。當(dāng)腳本需要從命令行讀取數(shù)據(jù)時,只需要在其中添加如下的read語句即可:read變量名當(dāng)腳本執(zhí)行到該語句時,終端會等待用戶輸入,用戶輸入的信息將被保存到read之后的變量中。4.變量的分類前面提到的變量稱為局部變量或本地變量,這些變量定義在腳本中,只在該腳本中生效。除此之外,Shell中還有一些獨特的變量,包括環(huán)境變量、位置變量、標(biāo)準(zhǔn)變量和特殊變量。1)環(huán)境變量環(huán)境變量又稱永久變量,與局部變量相對,用于創(chuàng)建該變量的Shell和從該Shell派生的子Shell或進(jìn)程中。為了區(qū)別于局部變量,環(huán)境變量中的字母全部為大寫。環(huán)境變量可以用來控制用戶程序的執(zhí)行,為程序編寫提供環(huán)境。用戶可以使用env、export或set命令來查詢和修改環(huán)境變量。其用法如下:$env #顯示所有的環(huán)境變量$export #同上若要將一個已存在的本地變量修改為環(huán)境變量,可以使用以下方法:export變量名若要定義一個環(huán)境變量,則使用以下格式export變量名=值常見的環(huán)境變量如下:(1)HOME:主目錄,用戶登入系統(tǒng)時所在的目錄;(2)LOGNAME、USER和USERNAME:登入用戶名、用戶、用戶名;(3)IFS:命令行內(nèi)部參數(shù)、選項間的分隔符,默認(rèn)為空格;(4)PATH:冒號用于分隔路徑名稱,shell根據(jù)PATH中的變量路徑來查找命令名,查找到第一個與命令一樣的可執(zhí)行文件就執(zhí)行它;(5)TERM:終端的類型。常用Linux和xterm;(6)PWD:當(dāng)前目錄的絕對路徑名,取值隨著cd命令跳轉(zhuǎn)到不同目錄而變化;(7)OLDPWD:舊的目錄,即剛離開的目錄。其值隨著cd而變化;(8)PS1:主提示符。默認(rèn)情況,超級用戶的提示符是“#”,普通用戶的提示符是“$”。(9)PS2:輔助提示符(繼續(xù)執(zhí)行提示符)。Shell在接收數(shù)據(jù)時,如果在輸入行的末尾輸入“\”后按回車鍵,或者命令沒有輸入完整(如引號或括號不對),則顯示該提示符,提示繼續(xù)輸入命令,默認(rèn)提示符是“>”。2)位置變量位置變量即執(zhí)行腳本時傳入腳本中對應(yīng)腳本位置的變量。類似函數(shù)的參數(shù),引用方法為$符號加上參數(shù)的位置,如$0、$1、$2。其中$0較為特殊,表示腳本的名稱,其余的分別表示腳本中的第一個參數(shù)、第二個參數(shù),以此類推。例如,當(dāng)前有一個名為loca的腳本,其中的內(nèi)容如下:#!/bin/shecho“numberofvars:”$#echo“nameofShellscript:”$0echo“firstvar:”$1echo“secondvar:”$2echo“thirdvar:”$3執(zhí)行該腳本時使用的命令與輸出的結(jié)果如下所示:$shlocaABCnumberofvars:3nameofShellscript:locafirstvar:Asecondvar:Bthirdvar:C3)標(biāo)準(zhǔn)變量標(biāo)準(zhǔn)變量也是環(huán)境變量,在bash環(huán)境建立時生成。該變量自動解析,通過查看etc目錄下的profile文件可以查看系統(tǒng)中的標(biāo)準(zhǔn)環(huán)境變量。使用env命令可以查看系統(tǒng)中的環(huán)境變量,包括環(huán)境變量和標(biāo)準(zhǔn)變量。4)特殊變量Shell中還有一些特殊的變量,這些變量及其含義分別如下:#:傳遞到腳本或函數(shù)的參數(shù)數(shù)量。?:前一個命令執(zhí)行情況,0表示成功,其他值表示失敗。$:運行當(dāng)前腳本的當(dāng)前進(jìn)程uid號。!:運行腳本最后一個命令。*:傳遞給腳本或函數(shù)的全部參數(shù)。例如,查看傳遞到腳本的參數(shù)數(shù)量,可以使用以下語句:echo$#這些變量的使用方法與普通變量相同。5.變量的運算Shell中的變量沒有明確的類型,變量值都以字符串的形式存儲,Shell中的算數(shù)運算一般通過let命令和expr命令實現(xiàn)。1)let命令let命令用于算術(shù)運算和數(shù)值表達(dá)式測試,其使用格式如下:let表達(dá)式假設(shè)現(xiàn)有一個名為let的腳本文件,其中內(nèi)容如下:#!/bin/shi=1echo“i=”$ileti=i+2echo“i=”$ilet“i=i+4”echo“i=”$i該腳本的執(zhí)行結(jié)果如下i=1i=3i=72)expr命令expr命令用于對整型變量進(jìn)行算術(shù)計算。使用expr命令時可以使兩個數(shù)值直接進(jìn)行運算:$expr3+5運算結(jié)果會直接在命令行中輸出。若要通過變量的引用進(jìn)行運算添加$符號即可。需要注意的是在運算符與變量或數(shù)據(jù)之間需要保留一個空格,否則該命令會將命令后的內(nèi)容原樣輸出。若要在Shell腳本中使用expr命令,需要使用符號“`”(該按鍵位于Tab鍵之上),將其內(nèi)嵌到等式中。假設(shè)現(xiàn)在要使用一個變量接收另外兩個變量的運算結(jié)果,方法如下:#!/bin/sha=10b=20value=`expr$a+$b`echo“valueis:$value”exit0執(zhí)行該腳本,結(jié)果如下:valueis:30<任務(wù)實施>一、編輯腳本使用vi編輯器創(chuàng)建一個名為first的文件,在插入模式下,向first文件中輸入以下內(nèi)容并保存,退出編輯器。#!/bin/shdata="firstShe11script"#定義一個變量并初始化echo$data#輸出變量dataecho"resultis:"#定義兩個整型變量并初始化a=1b=2echo$(($a+$b))#輸出a+b的結(jié)果exit0二、執(zhí)行腳本執(zhí)行腳本的方法有兩種:一種是將腳本作為可執(zhí)行文件;另一種方法是將腳本文件作為一個參數(shù),通過Shell解釋器對其進(jìn)行解析。1.將腳本作為可執(zhí)行文件若想執(zhí)行該腳本程序,需要確保該文件可執(zhí)行。但創(chuàng)建的文件一般默認(rèn)沒有可執(zhí)行權(quán)限,因此需要使用chmod命令來提升文件的權(quán)限。$chmod+xfirst提升文件權(quán)限之后,便可以執(zhí)行腳本文件了,執(zhí)行該文件的方式如下所示:$./first2.將腳本作為參數(shù)具體方法如下:$shfirstfirst腳本的執(zhí)行結(jié)果如下所示:firstShe11scriptresultis:3四、腳本文件內(nèi)容分析(1)Shell中以#開頭的行一般為注釋行,類似于C語言中的//,如腳本中的第2行和第4行,但第1行是例外。第1行的#!/bin/sh是一種特殊的注釋,#!后的參數(shù)表明了系統(tǒng)將會調(diào)用哪個程序來執(zhí)行該腳本。在本例中,/bin/sh是默認(rèn)的Shell程序。(2)腳本的第3行定義了一個變量data,并對該變量進(jìn)行了初始化。(3)腳本第5行的echo是一個輸出方法,類似于C語言中的printf()函數(shù),用于輸出數(shù)據(jù),輸出的內(nèi)容為data變量的值,符號$表示對變量的引用。(4)腳本的第6行同樣是echo語句。(5)腳本的第8、9兩行定義了變量a和b,并對該變量進(jìn)行了初始化。(6)腳本的第11行使用echo輸出a和b的計算結(jié)果。(7)腳本的最后一行是exit命令,其作用是確保該腳本程序能夠返回一個有意義的退出碼。任務(wù)二條件語句的使用一、條件判斷1.條件判斷命令條件判斷是條件語句的核心,Shell中通常使用test命令或[]命令對條件進(jìn)行判斷,判斷的內(nèi)容可以是變量或文件。前文提到,每個腳本程序的末尾最好加上exit命令,以便提供該腳本的返回值給其他腳本程序,而這些退出碼往往應(yīng)用于條件判斷中。1)test命令test命令的語法格式如下:test選項參數(shù)2)[]命令[]命令與test命令的功能相同,因此以上功能也可以使用[]命令來實現(xiàn)。需要注意的是,[]命令與選項及參數(shù)之間應(yīng)有空格。因此在[]符號中的檢查條件之間需要留出空格,否則將會產(chǎn)生錯誤。2.條件判斷的分類Shell中的條件判斷通常可以分為三類,字符串比較、算術(shù)比較和針對文件的條件測試。二、條件語句Shell中常用的條件語句有if語句、select語句和case語句。1.if語句Shell中的if條件語句分為單分支if語句、雙分支if語句和多分支if語句,其結(jié)構(gòu)與其他程序設(shè)計語言的條件語句類似。(1)單分支if語句是最簡單的條件語句,它對某個條件判斷語句的結(jié)果進(jìn)行檢測,根據(jù)測試的結(jié)果選擇要執(zhí)行的語句。單分支if語句的格式如下:if[條件判斷語句];then …fi其中關(guān)鍵字為:if、then和fi,fi表示該語句到此結(jié)束。(2)雙分支if語句類似于C語言中的if…else…語句,其格式如下:if[條件判斷語句];then …else …fi其中的關(guān)鍵字為:if、then、else和fi。(3)多分支if語句中可以出現(xiàn)不止一個的條件判斷,其格式如下:if[條件判斷語句];then …elif[條件判斷語句];then …fi多分支if語句中的關(guān)鍵字為:if、then、elif、else和fi,其中elif相當(dāng)于其他編程語言中的elseif。2.select語句Shell中的select語句可以將選項列表做出類似菜單的格式,以交互的形式選擇列表中的數(shù)據(jù),傳入select語句中的主體部分加以執(zhí)行。select語句的格式如下:select變量in列表do … [break]done其中關(guān)鍵字為:select、break和done。select語句實質(zhì)上也是一個循環(huán)語句,若不添加break關(guān)鍵字,程序?qū)o法跳出select結(jié)構(gòu)。3.case語句case語句可以將一個變量的內(nèi)容與多個選項進(jìn)行匹配,若匹配成功,則執(zhí)行該條件下對應(yīng)的語句。case語句的格式如下:casevarin

選項1)…;; ‘選項2’)…;; “選項3”)…;; … *)…esac其中選項表示匹配項,用于與var值進(jìn)行匹配。匹配項可以使用引號(單引號/雙引號)引起來,也可以直接列出。選項后需添加)之后才是對應(yīng)匹配條件下執(zhí)行的內(nèi)容,每個匹配條件都以“;;”結(jié)尾;最后一個匹配項*類似C語言中的default,是一個通配符,該匹配項的末尾不需要“;;”。case語句中的關(guān)鍵字有case和esac。esac表示case語句到此結(jié)束。<任務(wù)實施>一、判斷文件是否目錄1.單輸出通過輸出文件名,判斷文件是否為目錄,若是,則輸出“[文件名]是個目錄”#!/bin/sh#單分支if語句readfilenameif[-d$filename];then echo$filename”是個目錄”fiexit0執(zhí)行腳本,輸入目錄名test_dir,該案例的執(zhí)行結(jié)果如下:test_dirtest_dir是個目錄2.雙輸出輸入文件名,判斷文件是否為目錄,若是,則輸出“[文件名]是個目錄”;否則輸出“[文件名]不是目錄”#!/bin/sh#雙分支if語句readfilenameif[-d$filename];then echo$fielname”是個目錄”else echo$filename”不是目錄”fiexit0執(zhí)行腳本,輸入文件名test_filename,輸出結(jié)果如下:test_filenametest_filename不是目錄3.多輸出判斷一個文件是否為目錄,若是,輸出目錄中的文件;若不是,判斷該文件是否可執(zhí)行。若能執(zhí)行,輸出“這是一個可執(zhí)行文件”;否則輸出“該文件不可執(zhí)行”。#!/bin/shreadfilenameif[-d$filename];then ls$filenameelif[-x$filename];then echo“這是一個可執(zhí)行文件”else echo“該文件不可執(zhí)行”fiexit0執(zhí)行腳本并輸入不同內(nèi)容測試腳本執(zhí)行結(jié)果,輸入項及輸出結(jié)果分別如下。(1)輸入目錄~/,輸出結(jié)果如下:~/DesktopDocumentsDownloadsMusicPicturesVideos(2)輸入可執(zhí)行文件exec_file,輸出結(jié)果如下:exec_file這是一個可執(zhí)行文件(3)輸入不可執(zhí)行的文件notexec_file,輸出結(jié)果如下:notexec_file該文件不可執(zhí)行二、輸出目錄編寫腳本,腳本可輸出一個包含Android、Java、C++、iOS這四個選項的菜單供選擇。腳本根據(jù)用戶的選擇,輸出對應(yīng)的內(nèi)容,如YouhaveselectedC++。#!/bin/sh#select條件語句echo“Whatdoyouwanttostudy?”selectsubjectin“Android”“Java”“C++”“iOS”do echo“Youhaveselected$subject.” breakdoneexit0執(zhí)行該腳本,輸出結(jié)果如下:Whatdoyouwanttostudy?1)Android2)Java3)C++4)iOS#?3 #選擇選項3YouhaveselectedC++ #輸出結(jié)果三、四則運算實現(xiàn)一個簡單的四則運算,要求用戶從鍵盤輸入兩個數(shù)據(jù)和一個運算符。腳本程序根據(jù)用戶的輸入,輸出計算結(jié)果。#!/bin/shecho-e“a:\c”readaecho-e“b:\c”readbecho-e“select(+-*/):\c”readvarcase$varin ‘+’)echo“a+b=”`expr$a”+”$b`;; ‘-’)echo“a-b=”`expr$a”-”$b`;; ‘*’)echo“a*b=”`expr$a”*”$b`;; ‘/’)echo“a/b=”`expr$a”/”$b`;; *)echo“erroresacexit0該腳本中的echo后添加了選項-e,表示開啟轉(zhuǎn)義;輸出內(nèi)容的末尾添加了\c,表示輸出內(nèi)容之后不換行。執(zhí)行該腳本,結(jié)果如下:a:3b:6select(+-*/):+a+b=9任務(wù)三循環(huán)語句的使用一、循環(huán)語句循環(huán)是編程語言中的重要部分,它可以將多次重復(fù)運算凝聚在簡短程序中,大大減少代碼量。Shell腳本中常用的循環(huán)有for循環(huán)、while循環(huán)和until循環(huán)。1.for循環(huán)for循環(huán)的格式如下:for變量in變量列表:do …done其中變量是在當(dāng)前循環(huán)中使用的一個對象,用來接收變量列表中的元素;變量列表是整個循環(huán)要操作的對象的集合,可以是字符串集合或文件名、參數(shù)等,變量列表的值會被逐個賦給變量。2.while循環(huán)while循環(huán)的格式如下:while[表達(dá)式]:do …done在while循環(huán)中,當(dāng)表達(dá)式的值為假時停止循環(huán),否則循環(huán)將一直進(jìn)行。此處表達(dá)式外的[]表示的是[]命令,而非語法格式中的中括號,不能省略。3.until循環(huán)until循環(huán)的格式如下:until[表達(dá)式]:do …doneuntil循環(huán)與while循環(huán)的格式基本相同,不同的是,當(dāng)until循環(huán)的條件為假時,才能繼續(xù)執(zhí)行循環(huán)中的命令。<任務(wù)實施>一、輸出月份列表使用for循環(huán)輸出月份列表中的12個月份:#!/bin/shformonthinJanFebMarAprMayJunJulAugSepOctNovDecdo echo-e“$month\t\c”doneechoexit0執(zhí)行該腳本,輸出的結(jié)果如下:JanFebMarAprMayJunJulAugSepOctNovDec需要注意的是,變量列表中的每個變量可以使用引號單獨引起來,但是不能將整個列表置于一對引號中,因為使用一對引號引起來的值會被視為一個變量。二、計算整數(shù)1~100的和使用while循環(huán)計算整數(shù)1~100的和:#!/bin/shcount=1sum=0while[$count-le100]do sum=`expr$sum+$count` count=`expr$count+1`doneecho“sum=$sum”exit0執(zhí)行該腳本,輸出的結(jié)果如下:sum=5050三、輸出數(shù)據(jù)使用until循環(huán)輸出有限個數(shù)據(jù):#!/bin/shi=1until[$i-gt3]do echo“thenumberis$i” i=`expr$i+1`doneexit0執(zhí)行該腳本,輸出的結(jié)果如下:thenumberis1.thenumberis2.thenumberis3.任務(wù)四函數(shù)的使用函數(shù)將某個要實現(xiàn)的功能模塊化,使代碼結(jié)構(gòu)和程序的工作流程更為清晰,也提高了程序可讀性和可重用性,是程序中重要的部分。一、參數(shù)傳遞在C語言中,一般在函數(shù)名后的括號中使用參數(shù)列表傳遞函數(shù)間的數(shù)據(jù)。Shell腳本的函數(shù)中沒有參數(shù)列表,而是使用位置變量獲取參數(shù),其中$0代表函數(shù)名稱,$n代表傳入函數(shù)的第n個參數(shù)。函數(shù)中的位置變量與腳本中的位置變量不沖突。函數(shù)中的位置變量在函數(shù)調(diào)用處傳入,腳本中的位置變量在腳本執(zhí)行時傳入。除了常見的幾種傳遞參數(shù)字符以外,還有一些特殊的傳遞參數(shù)字符,如表所示。二、函數(shù)定義Shell腳本是逐行執(zhí)行的,函數(shù)需要在使用前定義。Shell中的函數(shù)相當(dāng)于用戶自定義的命令,函數(shù)名相當(dāng)于命令名,代碼段用來實現(xiàn)該函數(shù)的核心功能,其函數(shù)格式如下:function函數(shù)名(){

代碼段 return0}(1)在Shell腳本中定義函數(shù)時,可以使用關(guān)鍵字function,也可以不使用;(2)函數(shù)名后的括號可以省略,若省略,則函數(shù)名與{之間需要有空格;(3)Shell腳本中的函數(shù)不帶任何參數(shù);(4)Shell腳本函數(shù)中可以使用return返回一個值,也可以不返回,若不設(shè)置返回值,則該函數(shù)返回最后一條命令的執(zhí)行結(jié)果。<任務(wù)實施>一、輸出“helloworld”(1)定義一個hello()函數(shù),該函數(shù)可以輸出helloworld,并在腳本中使用該函數(shù)。#!/bin/shfunctionhello(){ echo“helloworld”}helloexit0執(zhí)行腳本,輸出結(jié)果如下:helloworld二、顯示輸入結(jié)果分別為腳本中的位置變量和函數(shù)中的位置變量傳遞參數(shù):#!/bin/sh#functionfunction_choice(){ echo“Yourchoiceis$1”}#maincase$1in “C++”)_choiceC++;; “Android”)_choiceAndroid;; “Python”)_choicePython;; *)echo“$0:pleaseselectin(C++/Android/Python)”esacexit0在命令行中輸入shfunC++,執(zhí)行該腳本,執(zhí)行結(jié)果如下:$shfunC++YourchoiceisC++三、驗證局部變量#!/bin/shfunctionfun(){ a=10 echo“func:a=$a”}a=5echo“main:a=$a”funecho“main:a=$a”exit0執(zhí)行該腳本,輸出結(jié)果如下:main:a=5fun:a=10main:a=10下面通過一個例子來展示local的用法。#!/bin/shfunctionfun(){ locala=10 echo“fun:a=$a”}a=5echo“main:a=$a”funecho“main:a=$a”exit0執(zhí)行腳本,輸出結(jié)果如下:main:a=5fun:a=10main:a=5根據(jù)輸出結(jié)果可知,在函數(shù)調(diào)用前后,腳本中全局變量a的值一致,這說明使用關(guān)鍵字local定義在函數(shù)中的變量是一個局部變量。四、參數(shù)傳遞#!/bin/bashecho"Shell傳遞參數(shù)實例!";echo"執(zhí)行的文件名:$0";echo"第一個參數(shù)為:$1";echo"第二個參數(shù)為:$2";echo"第三個參數(shù)為:$3";為腳本設(shè)置可執(zhí)行權(quán)限,并執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh123Shell傳遞參數(shù)實例!執(zhí)行的文件名:./test.sh第一個參數(shù)為:1第二個參數(shù)為:2第三個參數(shù)為:3#!/bin/bashecho"Shell傳遞參數(shù)實例!";echo"第一個參數(shù)為:$1";echo"參數(shù)個數(shù)為:$#";echo"傳遞的參數(shù)作為一個字符串顯示:$*";執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh123Shell傳遞參數(shù)實例!第一個參數(shù)為:1參數(shù)個數(shù)為:3傳遞的參數(shù)作為一個字符串顯示:123$*與$@都引用所有參數(shù),二者的不同點只有在雙引號中體現(xiàn)出來。設(shè)在腳本運行時寫了三個參數(shù)1、2、3,,則"*"等價于"123"(傳遞了一個參數(shù)),而"@"等價于"1""2""3"(傳遞了三個參數(shù))。#!/bin/bashecho"--\$*演示"foriin"$*";doecho$idone

echo"--\$@演示"foriin"$@";doecho$idone執(zhí)行腳本,輸出結(jié)果如下:$chmod+xtest.sh$./test.sh123--$*演示

123--$@演示

123任務(wù)五

輸入輸出重定向的使用一、輸入/輸出重定向1.標(biāo)準(zhǔn)流執(zhí)行一個Shell命令時,通常會自動打開三個標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件,文件描述符為0,通常對應(yīng)終端的鍵盤;標(biāo)準(zhǔn)輸出文件,文件描述符為1,標(biāo)準(zhǔn)錯誤輸出文件,文件描述符為2,這兩個文件都對應(yīng)終端的屏幕。標(biāo)準(zhǔn)I/O流以及相關(guān)設(shè)備信息如表所示。2.輸出重定向重定向一般通過在命令間插入特定的符號來實現(xiàn),其語法格式如下:command1>file1該命令執(zhí)行command1后將輸出的內(nèi)容存入file1。任何file1內(nèi)已經(jīng)存在的內(nèi)容將被新內(nèi)容替代。如果要將新內(nèi)容添加在文件末尾,需要使用操作符>>。默認(rèn)情況下,將stdout重定向到file的語句如下:command>file將stderr重定向到file的語句如下:$command2>file將stderr追加到file文件末尾的語句如下:$command2>>file其中,2表示標(biāo)準(zhǔn)錯誤文件(stderr)。將stdout和st

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論