Shell腳本編寫基礎(chǔ)_第1頁
Shell腳本編寫基礎(chǔ)_第2頁
Shell腳本編寫基礎(chǔ)_第3頁
Shell腳本編寫基礎(chǔ)_第4頁
Shell腳本編寫基礎(chǔ)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Shell本身是一個用C語言編寫的程序,它是用戶使用語言,又是一種程序設(shè)計語言。作為命令語言,Linux的橋梁。Shell既是一種命令它交互式地解釋和執(zhí)行用戶輸入的命令;作為程序設(shè)計語言,它定義了各種變量和參數(shù),并提供了許多在高級語言中才具有的控制結(jié)構(gòu),包括循環(huán)和分支。它雖然不是Linux系統(tǒng)核心的一部分,但它調(diào)用了系統(tǒng)核心的大部分功能來執(zhí)行程序、建立文件并以并行的方式協(xié)調(diào)各個程序的運行。因此,對于用戶來說,shell是最重要的實用程序,深入了解和熟練掌握shell的特性極其使用方法,是用好Linux系統(tǒng)的關(guān)鍵??梢哉f,shell使用的熟練程度反映了用戶對Linux使用的熟練程度。一、什么是s

2、hell當一個用戶登錄Linux系統(tǒng)之后,系統(tǒng)初始化程序init就為每一個用戶運行一個稱為shell(外殼)0000那么,shell是什么呢?確切一點說,shell就是一個命令行解釋器,它為用戶提供了一個向Linux內(nèi)核發(fā)送請求以便運行程序的界面系統(tǒng)級程序,用戶可以用shell來啟動、掛起、停止甚至是編寫一些程序。當用戶使用Linux時是通過命令來完成所需工作0。一個命令就是用戶和shell之間對話的一個基本單位,它是由多個字符組成并以換行結(jié)束的字符串。shell解釋用戶輸入0命令,就象DOS里0所做的一樣,所不同的是,在DOS中,只有一個,而在Linux下比較流行的shell0000,每個s

3、hell都各有千秋。一般的Linux系統(tǒng)都將bash作為默認的shellO二、幾種流行0shell00000shell0ash、bash、ksh、csh、zsh等,你可以用下面的命令來查看你自己的shell類型:#echo$SHELL$SHELL是一個環(huán)境變量,它記錄用戶所使用0shell類型。你可以用命令:#shell-name來轉(zhuǎn)換到別的shell,DOshell-name是你想要嘗試使用的shell0名稱,如ash等。這個命令為用戶又啟動了一個shell,這個shell在最初登錄的那個shell之后,稱為下級的shell或子shell。使用命令:$exit可以退出這個子shell。000

4、00shell0原因在于它們各自都有自己的特點,下面作一個簡單的介紹:ashashshell是由KennethAlmquist編寫0,Linux中占用系統(tǒng)資源最少0一個小shell,它只包含24個內(nèi)部命令,因而00起來很不方便。2.bashbash是Linux系統(tǒng)默認000shell,它由BrianFox和ChetRamey共同完成,是BourneAgainShell0縮寫,內(nèi)部命令一共04000Linux00它作為默認0shell是因為它有諸如以下0特色:000000DOS下面的doskey0功能,用方向鍵查閱和快速輸入并修改命令。自動通過查找匹配0方式給出以某字符串開頭0命令。包含了自身0

5、幫助功能,你只要在提示符下面鍵入help就可以得到相關(guān)0幫助。kshksh是Kornshell0縮寫,由EricGisin編寫,共有42條內(nèi)部命令。該shell最大0優(yōu)點是幾乎和商業(yè)發(fā)行版0ksh完全兼容,這樣就可以在不0花錢購買商業(yè)版本0情況下嘗試商業(yè)版本0性能了。cshcsh是Linux比較大的內(nèi)核,它由以WilliamJoy為代表的共計47位作者編成,共有52個內(nèi)部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。zchzch是Linux最大的shell之一,由PaulFalstad00,0084個內(nèi)部命令。如果只是一般的用途,是沒有必

6、要安裝這樣的shell的。3.shell程序設(shè)計(基礎(chǔ)部分)其實作為命令語言交互式地解釋和執(zhí)行用戶輸入的命令只是shell0000000,shell還可以用來進行程序設(shè)計,它提供了定義變量和參數(shù)的手段以及豐富的程序控制結(jié)構(gòu)。使用shell編程類似于DOS中的批處理文件,稱為shellscript,又叫shell程序或shell命令文件。l.shell基本語法shell的基本語法主要就是如何輸入命令運行程序以及如何在程序之間通過shell的一些參數(shù)提供便利手段來進行通訊。(1)輸入輸出重定向在Linux中,每一個進程都有三個特殊的文件描述指針:標準輸入(standardinput,文件描述指針為

7、0)、標準輸出(standardoutput,文件描述指針為1)、標準錯誤輸出(standarderror,文件描述指針為2)。這三個特殊的文件描述指針使進程在一般情況下接收標準輸入終端的輸入,同時由標準終端來顯示輸出,Linux同時也向使用者提供可以使用普通的文件或管道來取代這些標準輸入輸出設(shè)備。在shell中,使用者可以利用“”和“”。(2)用戶定義的變量用戶可以按照下面的語法規(guī)則定義自己的變量:變量名=變量值要注意的一點是,在定義變量時,變量名前不應加符號“$”,在引用變量的內(nèi)容時則應在變量名前加“$”;在給變量賦值時,等號兩邊一定不能留空格,若變量中本身就包含了空格,則整個字符串都要用

8、雙引號括起來。在編寫shellODD,為了使變量名和命令名相區(qū)別,示。建議所有的變量名都用大寫字母來表有時我們想要在說明一個變量并對它設(shè)定為一個特定值后就不在改變它的值,的命令來保證一個變量的只讀性:readly變量名在任何時候,建立的變量都只是當前shell的局部變量,這可以用下面所以不能被shell運行的其他命令或shell程序所利用,其格式為:export命令可以將一局部變量提供給shell執(zhí)行的其他命令使用,export變量名也可以在給變量賦值的同時使用export變量名=變量值使用export說明的變量,在(3)位置參數(shù)位置參數(shù)是一種在調(diào)用輸入的參數(shù)。位置參數(shù)之間用空格分隔,expo

9、rt命令:shell以后運行的所有命令或程序中都可以訪問到。shell程序的命令行中按照各自的位置決定的變量,shell取第一個位置參數(shù)替換程序文件中的二個替換$2,依次類推。$0是一個特殊的變量,所以,$0不是一個位置參數(shù),在顯示當前所有的位置參數(shù)時是不包括(4)預定義變量它的內(nèi)容是當前這個預定義變量和環(huán)境變量相類似,也是在shell一開始時就定義了的變量,是在程序名之后$1,第shell程序的文件名,$0的。所不同的是,用戶只能根據(jù)shell的定義來使用這些變量,而不能重定義它。所有預定義變量都是由$符和另一個符號組成的,常用的shell預定義變量有:$#:位置參數(shù)的數(shù)量$*:所有位置參數(shù)

10、的內(nèi)容$?:命令執(zhí)行后返回的狀態(tài)$:當前進程的進程號$!:后臺運行的最后一個進程號$0:當前執(zhí)行的進程名其中,“$?”用于檢查上一個命令執(zhí)行是否正確令正確執(zhí)行,任何非0值表示命令出錯)?!?”變量最常見的用途是用作臨時文件的名字以保證臨時文件不會重復。(5)參數(shù)置換的變量shell提供了參數(shù)置換能力以便用戶可以根據(jù)不同的條件來給變量賦不同的值。(在Linux中,命令退出狀態(tài)為0表示該命參數(shù)置換的變量有四種,這些變量通常與某一個位置參數(shù)相聯(lián)系,決定變量的取值,它們的語法和功能分別如下。a.變量二$參數(shù)word:如果設(shè)置了參數(shù),即這種變量的值等于某一個參數(shù)的值,如果該參數(shù)沒有設(shè)置,則變量就等于根據(jù)

11、指定的位置參數(shù)是否已經(jīng)設(shè)置類則用參數(shù)的值置換變量的值,否則用word置換。word的值。b.變量=$參數(shù)=word:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則把變量設(shè)置成word然后再用word替換參數(shù)的值。注意,位置參數(shù)不能用于這種方式,因為在shell程序中不能為位置參數(shù)賦值。c.變量=$參數(shù)?word:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則就顯示并從shell中退出,如果省略了word,則顯示標準信息。這種變量要求一定等于某一個參word數(shù)的值,如果該參數(shù)沒有設(shè)置,就顯示一個信息,然后退出,因此這種方式常用于出錯指示。d.變量=$參數(shù)+word:如果設(shè)置了參數(shù),則用word置

12、換變量,否則不進行置換。所有這四種形式中的“參數(shù)”既可以是位置參數(shù),也可以是另一個變量,只是用位置參數(shù)的情況比較多。shell提供了用來控制程序執(zhí)行流程的命令,包括條件分支四、shell程序設(shè)計的流程控制和其他高級程序設(shè)計語言一樣,和循環(huán)結(jié)構(gòu),用戶可以用這些命令建立非常復雜的程序。與傳統(tǒng)的語言不同的是,shell用于指定條件值的不是布爾表達式而是命令和字符串。1.test測試命令test命令用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試,其測試符和相應的功能分別如下:(1)數(shù)值測試:-eq:等于則為真-ne:不等于則為真gt:大于則為真-ge:大于等于則為真-lt:小于則為

13、真-le:小于等于則為真(2)字符串測試:=:等于則為真!=:不相等則為真-z字符串:字符串長度偽則為真-n字符串:字符串長度不偽則為真(3)文件測試:-e文件名:如果文件存在則為真-r文件名:如果文件存在且可讀則為真-w文件名:如果文件存在且可寫則為真-x文件名:如果文件存在且可執(zhí)行則為真-s文件名:如果文件存在且至少有一個字符則為真-d文件名:如果文件存在且為目錄則為真-f文件名:如果文件存在且為普通文件則為真-c文件名:如果文件存在且為字符型特殊文件則為真-b文件名:如果文件存在且為塊特殊文件則為真另外,Linux還提供了與(“!”)、或(“0)、非(“a”)三個邏輯操作符用于將測試條件

14、連接起來,其優(yōu)先級為:“!”最高,“a”次之,“o”最低。同時,bash也能完成簡單的算術(shù)運算,格式如下:$expression例如:var1=2var2=$var1*10+1則:var2的值為21。2.if條件語句shell程序中的條件分支是通過if條件語句來實現(xiàn)的,其一般格式為:if條件命令串then條件為真時的命令串else條件為假時的命令串fi3.for循環(huán)賦給變量的幾個數(shù)值既可以在程序內(nèi)for循環(huán)的一般格式為:var,則在in之后給出的數(shù)值將順序var的取值將是位置參數(shù)。對變量的While循環(huán)的一般格式為:for循環(huán)對一個變量的可能的值都執(zhí)行一個命令序列。以數(shù)值列表的形式提供,也可以

15、在程序以外以位置參數(shù)的形式提供。for變量名in數(shù)值列表do若干個命令行done變量名可以是用戶選擇的任何字符串,如果變量名是替換循環(huán)命令列表中的$var。如果省略了in,則變量每一個可能的賦值都將執(zhí)行do和done之間的命令列表。4.while和until循環(huán)while和until命令都是用命令的返回狀態(tài)值來控制循環(huán)的。while若干個命令行1do若干個命令行2done只要while的“若干個命令行do.done之間的“若干個命令行1”中最后一個命令的返回狀態(tài)為真,2”。while循環(huán)就繼續(xù)執(zhí)行until命令是另一種循環(huán)結(jié)構(gòu),它和while命令相似,其格式如下:until若干個命令行1do若

16、干個命令行2doneuntil循環(huán)和while循環(huán)的區(qū)別在于:while循環(huán)在條件為真時繼續(xù)執(zhí)行循環(huán),而until則是在條件為假時繼續(xù)執(zhí)行循環(huán)。ShellDODOtrue和false兩條命令用于建立無限循環(huán)結(jié)構(gòu)的需要,它們的返回狀態(tài)分別是總為0或總為非0case條件選擇辻條件語句用于在兩個選項中選定一項,而case條件選擇為用戶提供了根據(jù)字符串或變量的值從多個選項中選擇一項的方法,其格式如下:casestringinexp-1)若干個命令行1;exp-2)若干個命令行2;*)其他命令行esacshell通過計算字符串string的值,將其結(jié)果依次和表達式exp-1、exp-2等進行比較,直到找

17、到一個匹配的表達式為止,如果找到了匹配項則執(zhí)行它下面的命令直到遇到一對分號(;)為止。在case表達式中也可以使用shell的通配符(“*”、“?”、“”)。通常用“*”作為case命令的最后表達式以便使在前面找不到任何相應的匹配項時執(zhí)行“其他命令行”的命令。無條件控制語句break和continuebreak用于立即終止當前循環(huán)的執(zhí)行,而contiune用于不執(zhí)行循環(huán)中后面的語句而立即開始下一個循環(huán)的執(zhí)行。這兩個語句只有放在do和done之間才有效。函數(shù)定義在shell中還可以定義函數(shù)。函數(shù)實際上也是由若干條shell命令組成的,因此它與shell程序形式上是相似的,不同的是它不是一個單獨的

18、進程,而是shell程序的一部分。函數(shù)定義的基本格式為:functionname若干命令行調(diào)用函數(shù)的格式為:functionnameparam1param2shell函數(shù)可以完成某些例行的工作,而且還可以有自己的退出狀態(tài),因此函數(shù)也可以作為f、while等控制結(jié)構(gòu)的條件。在函數(shù)定義時不用帶參數(shù)說明,但在調(diào)用函數(shù)時可以帶有參數(shù),此時shell將把這些參數(shù)分別賦予相應的位置參數(shù)$1、$2、.及$*。8.命令分組在shell中有兩種命令分組的方法:“()”和“”,前者當shellDO()中的命令時將再創(chuàng)建一個新的子進程,然后這個子進程去執(zhí)行圓括弧中的命令。當用戶在執(zhí)行某個命令時不想讓命令運行時對狀態(tài)

19、集合(如位置參數(shù)、環(huán)境變量、當前工作目錄等)的改變影響到下面語句的執(zhí)行時,就應該把這些命令放在圓括弧中,這樣就能保證所有的改變只對子進程產(chǎn)生影響,而父進程不受任何干擾;用于將順序執(zhí)行的命令的輸出結(jié)果用于另一個命令的輸入(管道方式)。當我們要真正使用圓括弧和花括弧時(如計算表達式的優(yōu)先級),則需要在其前面加上轉(zhuǎn)義符()以便讓shell知道它們不是用于命令執(zhí)行的控制所用。9.信號trap命令用于在shell程序中捕捉到信號,之后可以有三種反應方式:執(zhí)行一段程序來處理這一信號接受信號的默認操作忽視這一信號trap對上面三種方式提供了三種基本形式:第一種形式的trap000shell接收到signal

20、list清單中數(shù)值相同的信號時,將執(zhí)行雙引號中的命令串。trapcommandssignal-listtrapcommandssignal-list為了恢復信號的默認操作,使用第二種形式的trap00:trapsignal-list第三種形式的trap00允許忽視信號:trapsignal-list注意:(1)對信號11(段違例)不能捕捉,因為shell本身需要捕捉該信號去進行內(nèi)存的轉(zhuǎn)儲。在trap中可以定義對信號0的處理(實際上沒有這個信號),shell程序在其終止(如執(zhí)行exit語句)時發(fā)出該信號。在捕捉到signal-list中指定的信號并執(zhí)行完相應的命令之后,如果這些命令沒有將shel

21、l程序終止的話,shell程序?qū)⒗^續(xù)執(zhí)行收到信號時所執(zhí)行的命令后面的命令,這樣將很容易導致shell程序無法終止。另外,在trap語句中,單引號和雙引號是不同的,當shell程序第一次碰到trap語句時,將把commands中的命令掃描一遍。此時若commands是用單引號括起來的話,那么shell不會對commands中的變量和命令進行替換,否則commands中的變量和命令將用當時具體的值來替換。五、運行shell00000用戶可以用任何編輯程序來編寫shellODD因為shell0序是解釋執(zhí)行的,所以不需要編譯裝配成目標程序,按照shell編程的慣例,以bash為例,程序的第一行一般為“

22、#!/bin/bash”,其中#表示該行是注釋,嘆號“!”告訴shell運行嘆號之后000并用文件的其余部分作為輸入,也就是運行/bin/bash并讓/bin/bash去執(zhí)行shell000內(nèi)容。DOshell000方法有三種:(1)shshell00文件名這種方法000格式為:bashshell00000這實際上是調(diào)用一個新的bash00解釋00,而把shell00文件名作為參數(shù)傳遞給它。新啟動0shell將去讀指定000,執(zhí)行文件中列出000,當所有000都執(zhí)行完結(jié)束。該方法的優(yōu)點是可以利用shell調(diào)試功能。(2)sh格式為:bash這種方式就是利用輸入重定向,使shell命令解釋程序的

23、輸入取自指定的程序文件。用chmod命令使shell程序成為可執(zhí)行的一個文件能否運行取決于該文件的內(nèi)容本身可執(zhí)行且該文件具有執(zhí)行權(quán)。對于shell程序,當用編輯器生成一個文件時,系統(tǒng)賦予的許可權(quán)限都是運行這個文件時,只需要直接鍵入文件名即可。在這三種運行shell000000,最好按下面的方式選擇:它的正確性還沒有把握時,應當使用第一種方式進行調(diào)試。應使用第三種方式把它固定下來,以后只要鍵入相應的文件名即可,用。六、bash000DD在編程過程中難免會出錯,有的時候,調(diào)試程序比編寫程序花費的時間還要多,同樣如此。shell0序的調(diào)試主要是利用bash命令解釋程序的選擇項。調(diào)用bash-選擇項s

24、hell00000幾個常用的選擇項是:-e:如果一個命令失敗就立即退出-n:讀入命令但是不執(zhí)行它們-u:置換時把未設(shè)置的變量看作出錯644(rw-r-r-),因此,當用戶需要當剛建立一個shell00,對當一個shell程序已經(jīng)調(diào)試好時,并可被另一個00所調(diào)shell00bash的形式是:-V:當讀入shell輸入行時把它們顯示出來-X:執(zhí)行命令時把命令和它們的參數(shù)顯示出來上面的所有選項也可以在shell程序內(nèi)部用“set-選擇項”的形式引用,而“set+選擇項”則可以將該部分用上面兩個語句包圍起來。1.未置變量退出和立即退出未置變量退出特性允許用戶對所有變量進行檢查,shell000執(zhí)行。s

25、hell通常允許未置變量0使用,在這種情況下,變量0值為空。如果設(shè)置了未置變量退出選擇項,則一旦使用了未置變量就顯示錯誤信息,并終止000運行。未置變量退出選擇項為“-u”。當shell運行時,若遇到不存在或不可執(zhí)行0命令、重定向失敗或命令非正常結(jié)束等情況時,如果未經(jīng)重新定向,該出錯信息會打印在終端屏幕上,而shell00仍將繼續(xù)執(zhí)行。要想在錯誤發(fā)生時迫使shell00立即結(jié)束,可以使用“-e”選項將shell000執(zhí)行立即終止。如果引用了一個未賦值的變量就終止則將禁止該選擇項起作用。如果只想對00的某一部分使用某些選擇項時,2.shell程序的跟蹤調(diào)試shell程序的主要方法是利用shell

26、命令解釋程序的“-v”或“-x”選項來跟蹤程序的執(zhí)行?!?v”選擇項使shell在執(zhí)行程序的過程中,把它讀入的每一個命令行都顯示出來,而“-X”選擇項使shell在執(zhí)行程序的過程中把它執(zhí)行的每一個命令在行首用一個“+”加上命令名顯示出來。并把每一個變量和該變量所取的值也顯示出來,因此,它們的主要區(qū)別在于:在執(zhí)行命令行之前無“-v”則打印出命令行的原始內(nèi)容,而有“-v”則打印出經(jīng)過替換后的命令行的內(nèi)容。除了使用shellCD-v”和“-x”選擇項以外,還可以在shell程序內(nèi)部采取一些輔助調(diào)試的措施。例如,可以在shell程序的一些關(guān)鍵地方使用echo命令把必要的信息顯示出來,它的作用相當于C語

27、言中的printf語句,這樣就可以知道程序運行到什么地方及程序目前的狀態(tài)。七、bash的內(nèi)部命令bash命令解釋程序包含了一些內(nèi)部命令。內(nèi)部命令在目錄列表時是看不見的,它們由shell本身提供。常用的內(nèi)部命令有:echo、eval、exec、export、readonly、read、shift、wait和點(.)。下面簡單介紹其命令格式和功能。1.echo命令格式:echoarg功能:在屏幕上打印出由eval命令格式:evalargs功能:當shell程序執(zhí)行到命令,然后執(zhí)行。execarg指定的字符串。eval語句時,shell讀入?yún)?shù)args,并將它們組合成一個新的命令格式:exec命令命

28、令參數(shù)功能:當shell執(zhí)行到exec語句時,不會去創(chuàng)建新的子進程,而是轉(zhuǎn)去執(zhí)行指定的命令,當指定的命令執(zhí)行完時,該進程,也就是最初的shell就終止了,所以shell程序中exec后面的語句將不再被執(zhí)行。4.export=變量值shell從而讓子進程繼承父進程中的環(huán)命令格式:export變量名或:export變量名功能:shell000export把它的變量向下帶入子境變量。但子shellODDexport把它的變量向上帶入父注意:不帶任何變量名的export語句將顯示出當前所有的5.readonlyshell。export變量。命令格式:readonly變量名功能:將一個用戶定義的shel

29、l變量標識為不可變的。不帶任何參數(shù)的示出所有只讀的shell變量。readonly命令將顯read命令格式:read變量名表功能:從標準輸入設(shè)備讀入一行,分解成若干字,賦值給7.shift語句功能:shift語句按如下方式重新命名所有的位置參數(shù)變量:程序中每使用一次shift語句,都使所有的位置參數(shù)依次向左移動一個位置,shell0序內(nèi)部定義的變量。$2成為$1,$3成為$2在并使位置參數(shù)“$#”減一,直到減到0。wait功能:是shell等待在后臺啟動的所有子進程結(jié)束。Wait的返回值總是真。exit功能:退出shell程序。在exit之后可有選擇地指定一個數(shù)字作為返回狀態(tài)?!?”(點)00

30、00:.Shell00000功能:使shell讀入指定的shell程序文件并依次執(zhí)行文件中的所有語句。1.Linux腳本編寫基礎(chǔ)1.1語法基本介紹1.1.1開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個例子中我們使用/bin/sh來執(zhí)行程序。當編輯好腳本時,如果要執(zhí)行該腳本,還必須使其可執(zhí)行。要使腳本可執(zhí)行:編譯chmod+xfilename這樣才能用./filename來運行1.1.2注釋在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。我們真誠地建議您在程序中使用注釋。如果您使用了注釋,那

31、么即使相當長的時間內(nèi)沒有使用該腳本,您也能在很短的時間內(nèi)明白該腳本的作用及工作原理。1.1.3變量在其他編程語言中您必須使用變量。在shellDOO,所有的變量都由字符串組成,并且您不需要對變量進行聲明。要賦值給一個變量,您可以這樣寫:#!/bin/sh#對變量賦值:a=helloworld#現(xiàn)在打印變量a的內(nèi)容:echoAis:echo$a有時候變量名很容易與其他文字混淆,比如:num=2echothisisthe$numnd這并不會打印出thisisthe2nd,而僅僅打印thisisthe,因為shell會去搜索變量numnd的值,但是這個變量時沒有值的??梢允褂没ɡㄌ杹砀嬖Vshell我

32、們要打印的是num變量:num=2echothisisthe$numnd這將打?。簍hisisthe2nd環(huán)境變量由export關(guān)鍵字處理過的變量叫做環(huán)境變量。我們不對環(huán)境變量進行討論,因為通常情況下僅僅在登錄腳本中使用環(huán)境變量。Shell命令和流程控制在shell腳本中可以使用三類命令:1)Unix命令:雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。常用命令語法及功能echosometext:將文字內(nèi)容打印在屏幕上ls:文件列表wc-lfilewc-wfilewc-cfile:計算文件行數(shù)計算文件中的單詞數(shù)計算文件中

33、的字符數(shù)cpsourcefiledestfile:文件拷貝mvoldnamenewname:重命名文件或移動文件rmfile:刪除文件greppatternfile:在文件內(nèi)搜索字符串比如:grepsearchstringfile.txtcut-bcolnumfile:指定欲顯示的文件內(nèi)容范圍,并將它們輸出到標準輸出設(shè)備比如:輸出每行第5個到第9個字符cut-b5-9file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令catfile.txt:輸出文件內(nèi)容到標準輸出設(shè)備(屏幕)上filesomefile:得到文件類型readvar:提示用戶輸入,并將輸入賦值給變量sortfile.t

34、xt:對file.txt文件中的行進行排序uniq:刪除文本文件中出現(xiàn)的行列比如:sortfile.txt|uniqexpr:進行數(shù)學運算Example:add2and3expr2+3find:搜索文件比如:根據(jù)文件名搜索find.-namefilename-printtee:將數(shù)據(jù)輸出到標準輸出設(shè)備(屏幕)和文件比如:somecommand|teeoutfilebasenamefile:返回不包含路徑的文件名比如:basename/bin/tux將返回tuxdirnamefile:返回文件所在路徑比如:dirname/bin/tux將返回/binheadfile:打印文本文件開頭幾行tail

35、file:打印文本文件末尾幾行sed:Sed是一個基本的查找替換程序??梢詮臉藴瘦斎耄ū热缑罟艿溃┳x入文本,并將結(jié)果輸出到標準輸出(屏幕)。該命令采用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus替換為LinuxFocus:cattext.file|seds/linuxfocus/LinuxFocus/newtext.fileawk:awk用來從文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。catfile.txt|awk-F,print$1,$3這里我們使用,作為字段分割符,同時打印第一個和第三個字段。如果該文件內(nèi)容如

36、下:AdamBor,34,IndiaKerryMiller,22,USA命令輸出結(jié)果為:AdamBor,IndiaKerryMiller,USA2)概念:管道,重定向和backtick這些不是系統(tǒng)命令,但是他們真的很重要。管道(|)將一個命令的輸出作為另外一個命令的輸入。grephellofile.txt|wc-l在file.txt中搜索包含有”hello”的行并計算其行數(shù)。在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。重定向:將命令的結(jié)果輸出到文件,而不是標準輸出(屏幕)。寫入文件并覆蓋舊文件加到文件的尾部,保留舊文件內(nèi)容。反短斜線使用反短斜線可以將一個命令的輸出作為另

37、外一個命令的一個命令行參數(shù)。命令:find.-mtime-1-typef-print用來查找過去24ODD-mtime-2則表示過去48小時)內(nèi)修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:#!/bin/sh#Theticksarebackticks()notnormalquotes():tar-zcvflastmod.tar.gzfind.-mtimeT-typef-print3)流程控制1.ifif表達式如果條件為真則執(zhí)行then后面的部分:if;thenelif;thenelsefi大多數(shù)情況下,可以使用測試命令來對條件進行測試。比如可以比較字符串、判斷文件是否存

38、在及是否可讀等等通常用來表示條件測試。注意這里的空格很重要。要確保方括號的空格。-fsomefile:判斷是否是一個文件-x/bin/ls:判斷/bin/ls是否存在并有可執(zhí)行權(quán)限-n$var:判斷$var變量是否有值$a=$b:判斷$a0$b是否相等執(zhí)行mantest可以查看所有測試表達式可以比較和判斷的類型。直接執(zhí)行以下腳本:#!/bin/shif$SHELL=/bin/bash;thenechoyourloginshellisthebash(bourneagainshell)elseechoyourloginshellisnotbashbut$SHELLfi變量$SHELL包含了登錄sh

39、ell的名稱,我們和/bin/bash進行了比較??旖莶僮鞣煜語言的朋友可能會很喜歡下面的表達式:-f/etc/shadow&echoThiscomputerusesshadowpasswors這里&就是一個快捷操作符,如果左邊的表達式為真則執(zhí)行右邊的語句。您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則打印”Thiscomputerusesshadowpasswors”。同樣或操作(|)在shell編程中也是可用的。這里有個例子:#!/bin/shmailfolder=/var/spool/mail/james-r$mailfolderechoCannot

40、read$mailfolder;exit1;echo$mailfolderhasmailfrom:grepFrom$mailfolder該腳本首先判斷mailfolder是否可讀。如果可讀則打印該文件中的From一行。如果不可讀則或操作生效,打印錯誤信息后腳本退出。這里有個問題,那就是我們必須有兩個命令:-打印錯誤信息一般函數(shù)將-退出程序我們使用花括號以匿名函數(shù)的形式將兩個命令放到一起作為一個命令使用。在下文提及。不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。casecase:表達式可以用來匹配一個給定的字符串,而不是數(shù)字。case.in.)dosomet

41、hinghere;esac讓我們看一個例子。file命令可以辨別出一個給定文件的文件類型,比如:filelf.gz這將返回:ziplf.gz:gzipcompresseddata,deflated,originalfilename,lastmodified:MonAug2723:09:182001,os:Unix我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2,gzip和類型的壓縮文件:#!/bin/shftype二file”$1case$ftypein$1:Ziparchive*)unzip$1;$1:gzipcompressed*)gunzip$1;$1:bz

42、ip2compressed*)bunzip2$1;*)echoFile$1cannotbeuncompressedwithsmartzip;esac您可能注意到我們在這里使用了一個特殊的變量$1。該變量包含了傳遞給該程序的第一個參數(shù)值。也就是說,當我們運行:smartziparticles.zip$1就是字符串a(chǎn)rticles.zipselsectselect表達式是一種bash的擴展應用,尤其擅長于交互式使用。用戶可以從一組不同的值中進行選擇。selectvarin.;dobreakdonenow$varcanbeused下面是一個例子:#!/bin/shechoWhatisyourfavo

43、uriteOS?selectvarinLinuxGnuHurdFreeBSDOther;do這里出現(xiàn)了第二個特殊的變量$*,該變量包含了所有輸入的命令行參數(shù)值。breakdoneechoYouhaveselected$var下面是該腳本運行的結(jié)果:WhatisyourfavouriteOS?1)LinuxGnuHurdFreeBSDOther#?1YouhaveselectedLinux4.looploop表達式:while.;dodonewhile-loop將運行直到表達式測試為真。willrunwhiletheexpressionthatwetestforistrue.關(guān)鍵字break用來

44、跳出循環(huán)。而關(guān)鍵字”continue”用來不執(zhí)行余下的部分而直接跳到下一個循環(huán)。(字符串用空格分隔)然后將其賦給一個變量:for-loop表達式查看一個字符串列表forvarin;dodone在下面的例子中,將分別打印#!/bin/shforvarinABC;doechovaris$vardone下面是一個更為有用的腳本#!/bin/shABC到屏幕上:showrpm,其功能是打印一些RPM包的統(tǒng)計信息:listacontentsummaryofanumberofRPMpackagesUSAGE:showrpmrpmfile1rpmfile2.EXAMPLE:showrpm/cdrom/Red

45、Hat/RPMS/*.rpmforrpmpackagein$*;doif-r$rpmpackage;thenecho=$rpmpackage=rpm-qi-p$rpmpackageelseechoERROR:cannotreadfile$rpmpackagefidone如果您運行如果您運行showrpmopenssh.rpmw3m.rpmwebgrep.rpm此時$*包含了3個字符串,即openssh.rpm,w3m.rpmandwebgrep.rpm.5.引號在向程序傳遞任何參數(shù)之前,程序會擴展通配符和變量。這里所謂擴展的意思是程序會把通配符(比如jpg件,*)替換成合適的文件名,它變量替換

46、成變量值。為了防止程序作這種替換,您可以使用引號:讓我們來看一個例子,假設(shè)在當前目錄下有一些文件,兩個mail.jpg和tux.jpg。1.2編譯SHELL腳本#ch#!/bin/shmod+xfilenamecho*.jpgU緩螅梢醞D淙耄?./filename來執(zhí)行您的腳本。這將打印出mail.jpgtux.jpg的結(jié)果。引號(單引號和雙引號)將防止這種通配符擴展:#!/bin/shecho*.jpgecho*.jpg這將打印*.jpg兩次。單引號更嚴格一些。它可以防止任何變量擴展。雙引號可以防止通配符擴展但允許變量擴展。#!/bin/shecho$SHELLecho$SHELLecho$

47、SHELL運行結(jié)果為:/bin/bash/bin/bash$SHELL最后,還有一種防止這種擴展的方法,那就是使用轉(zhuǎn)義字符反斜桿:echo*.jpgecho$SHELL這將輸出:*.jpg$SHELL6.Heredocuments當要將幾行文字傳遞給一個命令時,heredocuments譯者注:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個heredocuments就不必用echo函數(shù)一行行輸出。一個Heredocument以開頭,后面接上一個字符串,這個字符串還必須出現(xiàn)在heredocument的末尾。下面是一個例子,在該例子中

48、,我們對多個文件進行重命名,并且使用heredocuments打印幫助:#!/bin/sh#wehavelessthan3arguments.Printthehelptext:if$#-lt3;thencatren-renamesanumberoffilesusingsedregularexpressionsUSAGE:renregexpreplacementfiles.EXAMPLE:renameallrenHTM$html*.HTMfilesin*.html:*.HTMHELPexit0fiOLD=$1NEW=$2#Theshiftcommandremovesoneargumentfrom

49、thelistof#commandlinearguments.shiftshift#$*containsnowallthefiles:forfilein$*;doif-f$file;thennewfile二echo$file|seds/$0LD/$NEW/gif-f$newfile;thenechoERROR:$newfileexistsalreadyelseechorenaming$fileto$newfile.mv$file$newfilefifi您就會發(fā)現(xiàn)在程序中可能在幾個地方使用了相同的代done字傳遞給cat命令,然后由cat命令將其打印在屏幕上。打印幫助文字后程序退出。如果輸入?yún)?shù)

50、等于或大于3個,我們就將第一個參數(shù)賦值給變量OLD,第二個參數(shù)賦值給變量NEW。下一步,我們使用shift命令將第一個和第二個參數(shù)從參數(shù)列表中刪除,這樣原來的第三個參數(shù)就成為參數(shù)列表$*的第一個參數(shù)。然后我們開始循環(huán),命令行參數(shù)列表被一個接一個地被賦值給變量$file。接著我們判斷該文件是否存在,如果存在則通過sed命令搜索和替換這是一個復雜一些的例子。讓我們詳細討論一下。第一個辻表達式判斷輸入命令行參數(shù)是否小于3個(特殊變量$#表示包含參數(shù)的個數(shù))。如果輸入?yún)?shù)小于3個,則將幫助文來產(chǎn)生新的文件名。然后將反短斜線內(nèi)命令結(jié)果賦值給newfile。這樣我們就達到了我們的目的:得到了舊文件名和新文

51、件名。然后使用4)函數(shù)如果您寫了一些稍微復雜一些的程序,mv命令進行重命名。碼,并且您也會發(fā)現(xiàn),如果我們使用了函數(shù),會方便很多。一個函數(shù)是這個樣子的:functionname()insidethebody$1isthefirstargumentgiventothefunction$2thesecond.body您需要在每個程序的開始對函數(shù)進行聲明。下面是一個叫做xtitlebar的腳本,使用這個腳本您可以改變終端窗口的名稱。這里使用了一個叫做help的函數(shù)。正如您可以看到的那樣,這個定義的函數(shù)被使用了兩次。#!/bin/sh#vim:setsw=4ts=4et:help()catxtitleb

52、ar-changethenameofanxterm,gnome-terminalorkdekonsoleUSAGE:xtitlebar-hstring_for_titelbarOPTIONS:-hhelptextEXAMPLE:xtitlebarcvsHELPexit0#incaseoferrororif-hisgivenwecallthefunctionhelp:-z$1&help$1=-h&help#sendtheescapesequencetochangethextermtitelbar:echo-e330;$107#在腳本中提供幫助是一種很好的編程習慣,這樣方便其他用戶(和您)使用和理

53、解腳本。命令行參數(shù)我們已經(jīng)見過$*和$1,$2.$9等特殊變量,這些特殊變量包含了用戶從命令行輸入的參數(shù)。迄今為止,我們僅僅了解了一些簡單的命令行語法(比如一些強制性的參數(shù)和查看幫助的-h選項)。但是在編寫更復雜的程序時,您可能會發(fā)現(xiàn)您需要更多的自定義的選項。通常的慣例是在所有可選的參數(shù)之前加一個減號,后面再加上參數(shù)值(比如文件名)。有好多方法可以實現(xiàn)對輸入?yún)?shù)的分析,但是下面的使用case表達式的例子無遺是一個不錯的方法。#!/bin/shhelp()catshiftby2-)shift;break;#endofoptions-*)echoerror:nosuchoption$1.-hforhelp;exit1;*)break;esacdoneechoopt_fis$opt_fechoopt_lis$opt_lechofirstargis$1echo2ndargis$2您可以這樣運行該腳本:cmdparser-lhello-f-somefile1somefile2返回的結(jié)果是:opt_fis1opt_lishellofirstargis-somefile1將輸入?yún)?shù)與Unix系統(tǒng)的慣例,并copy命令:expr命令2ndargissomefile2這個腳本是如何工作的呢?腳本首先在所有輸

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論