第五講shell程序設(shè)計(jì)_第1頁
第五講shell程序設(shè)計(jì)_第2頁
第五講shell程序設(shè)計(jì)_第3頁
第五講shell程序設(shè)計(jì)_第4頁
第五講shell程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五講第五講 shell shell 程序設(shè)計(jì)程序設(shè)計(jì) 5.1 概述概述 shell shell是是UNIXUNIX系統(tǒng)用用戶與操作系統(tǒng)交互的最基系統(tǒng)用用戶與操作系統(tǒng)交互的最基本工具,實(shí)際上本工具,實(shí)際上shellshell除了有命令解釋執(zhí)行的功能外,除了有命令解釋執(zhí)行的功能外,還具備有其他的功能,如:還具備有其他的功能,如:系統(tǒng)環(huán)境的設(shè)置系統(tǒng)環(huán)境的設(shè)置輸入輸出的重新定向輸入輸出的重新定向shellshell程序語言的設(shè)計(jì)等。程序語言的設(shè)計(jì)等。5.15.1概述概述 在在UNIX系統(tǒng)中使用系統(tǒng)中使用shell程序設(shè)計(jì),可以完成比較復(fù)雜并且自動(dòng)執(zhí)程序設(shè)計(jì),可以完成比較復(fù)雜并且自動(dòng)執(zhí)行的任務(wù)。行的任

2、務(wù)。UNIX系統(tǒng)上的系統(tǒng)上的shell程序在本質(zhì)上是一種程序在本質(zhì)上是一種解釋執(zhí)行的腳本解釋執(zhí)行的腳本語言語言,使用的元素是,使用的元素是UNIX系統(tǒng)的命令集,它與系統(tǒng)的命令集,它與windows系統(tǒng)中的系統(tǒng)中的bat批處理文件原理相同,但是比批處理文件更強(qiáng)大,也更靈活。批處理文件原理相同,但是比批處理文件更強(qiáng)大,也更靈活。 舉例舉例5.1 5.1 概述概述# append.sh# append.shcase $# incase $# in 1 ) cat data.txt; 1 ) cat data.txt; 2 ) cat $1 $2 ; 2 ) cat $1 $2 ; * * ) ech

3、o “Incorrect usage ! ” ; ) echo “Incorrect usage ! ” ;esacesac 舉例舉例5.1 5.1 概述概述 cd $HOME for dir in cc work do echo “. In $dir.” cd $dir for file in *.c do ls l $file done cddone 5.2 Shell5.2 Shell程序的執(zhí)行方式程序的執(zhí)行方式 Shell程序有多種執(zhí)行方式,比如,我們建立一個(gè)比較簡(jiǎn)單的程序有多種執(zhí)行方式,比如,我們建立一個(gè)比較簡(jiǎn)單的shell程序腳本,文件保存命名為程序腳本,文件保存命名為 test.

4、sh,內(nèi)容如下:內(nèi)容如下: date who ps執(zhí)行這個(gè)執(zhí)行這個(gè)test.sh可以有多種方式??梢杂卸喾N方式。1)將)將test.sh作為作為shell命令的執(zhí)行參數(shù)來完成該命令的執(zhí)行參數(shù)來完成該shell的執(zhí)行:的執(zhí)行: $ sh test.sh2)利用輸入輸出的重定向方式)利用輸入輸出的重定向方式 $ sh ”。 5.3 Shell5.3 Shell程序的變量:位置變量程序的變量:位置變量位置參數(shù)是一種在調(diào)用位置參數(shù)是一種在調(diào)用shell程序的命令行中按照各自的位置決定的變量,程序的命令行中按照各自的位置決定的變量,是在程序名之后輸入的參數(shù)。位置參數(shù)之間用空格分隔,是在程序名之后輸入的參

5、數(shù)。位置參數(shù)之間用空格分隔,shell取第一個(gè)位取第一個(gè)位置參數(shù)替換程序文件中的置參數(shù)替換程序文件中的$1,第二個(gè)替換,第二個(gè)替換$2,依次類推。,依次類推。$0是一個(gè)特殊是一個(gè)特殊的變量,它的內(nèi)容是當(dāng)前這個(gè)的變量,它的內(nèi)容是當(dāng)前這個(gè)shell程序的文件名,所以,程序的文件名,所以,$0不是一個(gè)位不是一個(gè)位置參數(shù),在顯示當(dāng)前所有的位置參數(shù)時(shí)是不包括置參數(shù),在顯示當(dāng)前所有的位置參數(shù)時(shí)是不包括$0的。的。# argv1 argv2 argv3 argv4 $0 $1 $2 $3 $4 6)Shell中命令的位置變量中命令的位置變量5.3 Shell5.3 Shell程序的變量:預(yù)定義變量程序的變量

6、:預(yù)定義變量Bshell變量變量CShell變量變量變量的作用變量的作用$#$#argv位置參數(shù)的個(gè)數(shù)位置參數(shù)的個(gè)數(shù)$*表示參數(shù)列表表示參數(shù)列表$?$status前一個(gè)命令返回的狀態(tài)值前一個(gè)命令返回的狀態(tài)值$當(dāng)前當(dāng)前shell進(jìn)程的進(jìn)程的pid值值$!最近訪問的后臺(tái)進(jìn)程最近訪問的后臺(tái)進(jìn)程pid值值預(yù)定義變量和環(huán)境變量相類似,也是在預(yù)定義變量和環(huán)境變量相類似,也是在shell一開始時(shí)就定義了的變量,所一開始時(shí)就定義了的變量,所不同的是,用戶只能根據(jù)不同的是,用戶只能根據(jù)shell的定義來使用這些變量,而不能重定義它。的定義來使用這些變量,而不能重定義它。所有預(yù)定義變量都是由所有預(yù)定義變量都是由$

7、符和另一個(gè)符號(hào)組成的,常用的符和另一個(gè)符號(hào)組成的,常用的shell預(yù)定義變量預(yù)定義變量有:有:5.3 Shell5.3 Shell程序的變量:變量替程序的變量:變量替換換 7)Shell中的變量替換中的變量替換 在在shell編程中,有時(shí)候會(huì)遇到這種情況,一個(gè)變量在尚未賦值編程中,有時(shí)候會(huì)遇到這種情況,一個(gè)變量在尚未賦值的時(shí)候,就被程序進(jìn)行了輸出處理,這樣輸出的變量將會(huì)得到的時(shí)候,就被程序進(jìn)行了輸出處理,這樣輸出的變量將會(huì)得到一個(gè)空字符串的結(jié)果。為了避免這種情況的發(fā)生,一個(gè)空字符串的結(jié)果。為了避免這種情況的發(fā)生,shell中引入中引入了變量替換的概念,在變量沒有賦值的時(shí)候可以用一個(gè)預(yù)先定了變量

8、替換的概念,在變量沒有賦值的時(shí)候可以用一個(gè)預(yù)先定義的字符串來替換。義的字符串來替換。替換的形式有三種,列舉如下:替換的形式有三種,列舉如下: $ var:-word 表示如果表示如果var已經(jīng)被賦值,則取它的值,否則取已經(jīng)被賦值,則取它的值,否則取word的值,但的值,但var不改變。不改變。 $ var:=word 表示如果表示如果var已經(jīng)被賦值,則取它的值,否則取已經(jīng)被賦值,則取它的值,否則取word的值,同時(shí)將的值,同時(shí)將word賦給賦給 var。 $ var:+word 表示如果表示如果var已經(jīng)被賦值,則取它的值,否則已經(jīng)被賦值,則取它的值,否則var變量置為空。變量置為空。 5.

9、4 test5.4 test命令的使用命令的使用 在在shell中經(jīng)常要對(duì)某些變量的值進(jìn)行判斷來決定分支程序的走中經(jīng)常要對(duì)某些變量的值進(jìn)行判斷來決定分支程序的走向,如同向,如同C中使用中使用 if( a = 0) 一樣。一樣。Shell中通過中通過test命令來完成這命令來完成這個(gè)功能。個(gè)功能。 test的格式表示為:的格式表示為: test expre 或者或者 test expre test命令的執(zhí)行結(jié)果是,如果表達(dá)式為真,則返回真值命令的執(zhí)行結(jié)果是,如果表達(dá)式為真,則返回真值0,否則,否則返回非返回非0的假值。的假值。 test命令可以對(duì)文件,字符串內(nèi)容,整數(shù)命令可以對(duì)文件,字符串內(nèi)容,

10、整數(shù)n等變量進(jìn)行測(cè)試。等變量進(jìn)行測(cè)試。 5.4 test5.4 test命令的使用命令的使用1)對(duì)文件特性的測(cè)試)對(duì)文件特性的測(cè)試 語法:語法: test -dfrwxs file -e文件名:如果文件存在則為真文件名:如果文件存在則為真 -r文件名:如果文件存在且可讀則為真文件名:如果文件存在且可讀則為真 -w文件名:如果文件存在且可寫則為真文件名:如果文件存在且可寫則為真 -x文件名:如果文件存在且可執(zhí)行則為真文件名:如果文件存在且可執(zhí)行則為真 -s文件名:如果文件存在且至少有一個(gè)字符則為真文件名:如果文件存在且至少有一個(gè)字符則為真 -d文件名:如果文件存在且為目錄則為真文件名:如果文件存

11、在且為目錄則為真 -f文件名:如果文件存在且為普通文件則為真文件名:如果文件存在且為普通文件則為真 -c文件名:如果文件存在且為字符型特殊文件則為真文件名:如果文件存在且為字符型特殊文件則為真 -b文件名:如果文件存在且為塊特殊文件則為真文件名:如果文件存在且為塊特殊文件則為真 5.4 test5.4 test命令的使用命令的使用例如:例如: $ test d /home/user & echo “directory exists” 判斷判斷/home/user 是否為一個(gè)目錄文件,如果為真(是否為一個(gè)目錄文件,如果為真(&)則執(zhí)行)則執(zhí)行echo進(jìn)行顯示進(jìn)行顯示 $ test x /home

12、/user/sh1.sh | echo “sh1.sh dos not exist or is not runnable !” 判斷文件判斷文件/home/user/sh1.sh是否可執(zhí)行,如果為假(是否可執(zhí)行,如果為假(|)則執(zhí)行)則執(zhí)行echo進(jìn)行顯示進(jìn)行顯示5.4 test5.4 test命令的使用命令的使用2)對(duì)字符串內(nèi)容的測(cè)試)對(duì)字符串內(nèi)容的測(cè)試 語法語法: test s (字符串字符串s為有值時(shí)返回真,為空則返回假)為有值時(shí)返回真,為空則返回假) test -zs 與與test s 相反,為空時(shí)返回真,不空則返回假相反,為空時(shí)返回真,不空則返回假 test s1 = s2 當(dāng)字符串

13、當(dāng)字符串s1和和s2相等時(shí)返回真,不相當(dāng)則返回假相等時(shí)返回真,不相當(dāng)則返回假 test s1 != s2 與與test s1=s2相反。相反。 例例 x1=“005” x2 =5 ,進(jìn)行字符串測(cè)試,進(jìn)行字符串測(cè)試#test “$x1” = “$x2”#echo $?系統(tǒng)將顯示系統(tǒng)將顯示0, 0, 結(jié)果為假值,結(jié)果為假值,表示表示x1x1和和x2x2不相等不相等5.4 test5.4 test命令的使用命令的使用3)對(duì)于整數(shù))對(duì)于整數(shù)n的的測(cè)試的的測(cè)試 格式格式 test n1 -eq/ne/it/ie/gt/ge n2 它們分別表示它們分別表示n1和和n2之間之間 相等相等 / /不相等不相等

14、 / /n1n2 / /n1n2 / /n1=n2 時(shí)時(shí)返回真值。返回真值。 例例 x1=“005” x2 =5 ,進(jìn)行數(shù)字式測(cè)試,進(jìn)行數(shù)字式測(cè)試#test “$x1” -eq “$x2”#echo $?系統(tǒng)將顯示系統(tǒng)將顯示1, 1, 結(jié)果為真值,結(jié)果為真值,表示數(shù)字表示數(shù)字x1x1和數(shù)字和數(shù)字x2x2相等相等5.5 5.5 條件控制語句條件控制語句在結(jié)構(gòu)化的程序設(shè)計(jì)中,三種基本的語句結(jié)構(gòu)是順序結(jié)構(gòu),分支結(jié)構(gòu),循在結(jié)構(gòu)化的程序設(shè)計(jì)中,三種基本的語句結(jié)構(gòu)是順序結(jié)構(gòu),分支結(jié)構(gòu),循環(huán)結(jié)構(gòu)。其中的分支結(jié)構(gòu),在環(huán)結(jié)構(gòu)。其中的分支結(jié)構(gòu),在shell中常用中常用if和和case語句來實(shí)現(xiàn)。語句來實(shí)現(xiàn)。 1)

15、if語句語句 if語句的分支可以有語句的分支可以有 無分支條件語句,二分支條件語句,多分支條件語句。無分支條件語句,二分支條件語句,多分支條件語句。 無分支條件語句格式無分支條件語句格式如下:如下: if condition then 命令命令1 命令命令2 命令命令n fi 當(dāng)條件當(dāng)條件condition為真時(shí),執(zhí)行為真時(shí),執(zhí)行then后面的所有命令,后面的所有命令,condition為假則執(zhí)行為假則執(zhí)行fi后面的語句。后面的語句。5.5 5.5 條件控制語句條件控制語句1)if語句語句 例:例:edit.sh if $#=1 then cp $1 $HOME/user1 fi vi $1

16、exit 05.5 5.5 條件控制語句條件控制語句二分支條件語句:二分支條件語句:格式為格式為 if then else 結(jié)構(gòu)結(jié)構(gòu) if condition then 命令命令1 命令命令2 else. 命令命令n fi多分支結(jié)構(gòu):多分支結(jié)構(gòu):分支大于分支大于2的條件語句。的條件語句。 if condition1 then elif contition2 then elif condition3 then else command_n fi5.5 5.5 條件控制語句條件控制語句例:假設(shè)一個(gè)連續(xù)運(yùn)行系統(tǒng),將建立錯(cuò)誤記錄文件例:假設(shè)一個(gè)連續(xù)運(yùn)行系統(tǒng),將建立錯(cuò)誤記錄文件errorfile 并不斷

17、寫并不斷寫入錯(cuò)誤信息。現(xiàn)在要求編寫一個(gè)入錯(cuò)誤信息?,F(xiàn)在要求編寫一個(gè)shell程序來產(chǎn)生定時(shí)錯(cuò)誤日志文件程序來產(chǎn)生定時(shí)錯(cuò)誤日志文件datelog,能在能在datelog 中體現(xiàn)每個(gè)時(shí)間段中的錯(cuò)誤信息中體現(xiàn)每個(gè)時(shí)間段中的錯(cuò)誤信息# checkerr.sh To check error information with time stamp !# checkerr.sh To check error information with time stamp !date datelogdate datelogif test r errorfileif test r errorfile then cat

18、errorfile datelog then cat errorfile datelog rm rm errorfile errorfileelseelse echo “No error occurs during this hour!“ datelog echo “No error occurs during this hour!“ datelogfifi5.5 5.5 條件控制語句條件控制語句2)case語句語句 可以實(shí)現(xiàn)多選一的控制結(jié)構(gòu)可以實(shí)現(xiàn)多選一的控制結(jié)構(gòu) case語句的語法為:語句的語法為: case word in 模式模式1 ) 命令命令 ; 模式模式2 ) 命令命令 ; 模式

19、模式3 ) 命令命令 ; esac注意,在注意,在case中,每個(gè)命名命令的結(jié)束用中,每個(gè)命名命令的結(jié)束用;表示模式匹配已經(jīng)完成,不表示模式匹配已經(jīng)完成,不再匹配其他的模式,相當(dāng)于再匹配其他的模式,相當(dāng)于C中的中的break。5.5 5.5 條件控制語句條件控制語句例:編寫一段例:編寫一段shell程序,根據(jù)執(zhí)行時(shí)獲取的當(dāng)前時(shí)間顯示不同的問候信息程序,根據(jù)執(zhí)行時(shí)獲取的當(dāng)前時(shí)間顯示不同的問候信息# hello.sh# hello.shhour = date +%Hhour = date +%Hcase $hour incase $hour in01-9 | 101 ) echo “Good mo

20、rining01-9 | 101 ) echo “Good morining !” ; !” ;1234567 ) echo “Good afternoon !” ;1234567 ) echo “Good afternoon !” ;) echo “Good evening ! ” ;) echo “Good evening ! ” ;esacesac5.5 5.5 條件控制語句條件控制語句例:利用例:利用shell的位置變量參數(shù)編寫一個(gè)的位置變量參數(shù)編寫一個(gè)shell,當(dāng)只有一個(gè)參數(shù)時(shí),從鍵盤,當(dāng)只有一個(gè)參數(shù)時(shí),從鍵盤輸入文本保存到輸入文本保存到data.txt中,當(dāng)有兩個(gè)參數(shù)時(shí),將參數(shù)中

21、,當(dāng)有兩個(gè)參數(shù)時(shí),將參數(shù)1代表的文件內(nèi)容添加代表的文件內(nèi)容添加到參數(shù)到參數(shù)2表示的文件,其他情況則給出錯(cuò)誤提示信息表示的文件,其他情況則給出錯(cuò)誤提示信息# append.sh# append.shcase $# incase $# in 1 ) cat data.txt; 1 ) cat data.txt; 2 ) cat $1 $2 ; 2 ) cat $1 $2 ; * * ) echo “Incorrect usage ! ” ; ) echo “Incorrect usage ! ” ;esacesac5.6 5.6 循環(huán)語句循環(huán)語句shell中的循環(huán)有中的循環(huán)有for和和while兩

22、種循環(huán)方式。兩種循環(huán)方式。1)for的語法格式為的語法格式為: for var in list-of-vars do command1 command2 commandn donefor的語法說明為:的語法說明為:shell程序掃描變量列表程序掃描變量列表list-of-vars,將其中的每一個(gè)字,將其中的每一個(gè)字依次存放在依次存放在var中,并執(zhí)行中,并執(zhí)行do和和done之間的語句。如果之間的語句。如果list-of-vars中有中有n個(gè)個(gè)字,則這個(gè)字,則這個(gè)for循環(huán)將執(zhí)行循環(huán)將執(zhí)行n次。次。 5.6 5.6 循環(huán)語句循環(huán)語句在需要的時(shí)候,也可以進(jìn)行在需要的時(shí)候,也可以進(jìn)行for循環(huán)的嵌

23、套。循環(huán)的嵌套。見下面的例子:見下面的例子: cd $HOME for dir in cc work do echo “. In $dir.” cd $dir for file in *.c do ls l $file done cddone 5.6 5.6 循環(huán)語句循環(huán)語句2)while循環(huán)循環(huán) while do done結(jié)構(gòu)結(jié)構(gòu) while循環(huán)中,只要循環(huán)條件為真就一直循環(huán)下去。循環(huán)中,只要循環(huán)條件為真就一直循環(huán)下去。 格式:格式: while condition do command1 command2 . done5.6 5.6 循環(huán)語句循環(huán)語句3)until循環(huán)循環(huán) untildod

24、one until循環(huán)和循環(huán)和while循環(huán)類似,所不同的是循環(huán)類似,所不同的是until循環(huán)只要循環(huán)條件為假,就一直循環(huán)只要循環(huán)條件為假,就一直執(zhí)行循環(huán)體。執(zhí)行循環(huán)體。格式:格式: until condition do command1 commandn done 如果第一次執(zhí)行時(shí),循環(huán)條件如果第一次執(zhí)行時(shí),循環(huán)條件condition就為真,那循環(huán)體將得不到執(zhí)行。就為真,那循環(huán)體將得不到執(zhí)行。同時(shí)還要注意,必須在程序中設(shè)置條件同時(shí)還要注意,必須在程序中設(shè)置條件condition為真的因素,否則循環(huán)將一為真的因素,否則循環(huán)將一直進(jìn)行下去,從而進(jìn)入了死循環(huán)。直進(jìn)行下去,從而進(jìn)入了死循環(huán)。 5.6

25、 5.6 循環(huán)語句循環(huán)語句例:編寫例:編寫shell程序一次性創(chuàng)建若干個(gè)新文件,如程序一次性創(chuàng)建若干個(gè)新文件,如file1, file2, file3. . . . . . file10兩個(gè)相關(guān)命令兩個(gè)相關(guān)命令touch touch 命令,改變文件的訪問和修改時(shí)間命令,改變文件的訪問和修改時(shí)間格式:格式: touch optiontime filenametouch optiontime filenameoptionoption -a -a 只修改文件的訪問時(shí)間只修改文件的訪問時(shí)間 -m -m 只修改文件的修改時(shí)間只修改文件的修改時(shí)間當(dāng)指定文件當(dāng)指定文件filenamefilename不存在,

26、則創(chuàng)建一個(gè)具有默認(rèn)權(quán)限和當(dāng)前時(shí)間的新文件不存在,則創(chuàng)建一個(gè)具有默認(rèn)權(quán)限和當(dāng)前時(shí)間的新文件5.6 5.6 循環(huán)語句循環(huán)語句例:編寫例:編寫shell程序一次性創(chuàng)建若干個(gè)新文件,如程序一次性創(chuàng)建若干個(gè)新文件,如file1, file2, file3. . . . . . file10兩個(gè)相關(guān)命令兩個(gè)相關(guān)命令exprexpr 命令,對(duì)命令,對(duì)shellshell變量進(jìn)行算術(shù)運(yùn)算的操作變量進(jìn)行算術(shù)運(yùn)算的操作, ,因?yàn)橐驗(yàn)閟hellshell變量都是字符變量都是字符型,進(jìn)行算術(shù)運(yùn)算必須使用型,進(jìn)行算術(shù)運(yùn)算必須使用exprexpr命令命令shellshell中錯(cuò)誤的算術(shù)運(yùn)算:中錯(cuò)誤的算術(shù)運(yùn)算:#count

27、 = 9#count = $count + 11#echo count系統(tǒng)將顯示:系統(tǒng)將顯示:9+119+11shellshell中正確的算術(shù)運(yùn)算:中正確的算術(shù)運(yùn)算:#count = 9#count = #echo count系統(tǒng)將顯示:系統(tǒng)將顯示:20205.6 5.6 循環(huán)語句循環(huán)語句例:編寫例:編寫shell程序一次性創(chuàng)建若干個(gè)新文件,如程序一次性創(chuàng)建若干個(gè)新文件,如file1, file2, file3. . . . . . file10# genfiles.shNUMBER = 1While $NUMBER lt 11 do touch file$NUMBER NUMBER = ex

28、pr $NUMBER + 1 done 5.75.7無條件控制語句無條件控制語句break和和continue breakbreak用于立即終止當(dāng)前循環(huán)的執(zhí)行,而用于立即終止當(dāng)前循環(huán)的執(zhí)行,而contiunecontiune用于不用于不執(zhí)行循環(huán)中后面的語句而立即開始下一個(gè)循環(huán)的執(zhí)行。這執(zhí)行循環(huán)中后面的語句而立即開始下一個(gè)循環(huán)的執(zhí)行。這兩個(gè)語句只有放在兩個(gè)語句只有放在dodo和和donedone之間才有效。之間才有效。 5.8 5.8 函數(shù)函數(shù) 在在shell中還可以定義函數(shù)。函數(shù)實(shí)際上也是由若干條中還可以定義函數(shù)。函數(shù)實(shí)際上也是由若干條shell命令組命令組成的,因此它與成的,因此它與shel

29、l程序形式上是相似的,不同的是它不是一個(gè)單程序形式上是相似的,不同的是它不是一個(gè)單獨(dú)的進(jìn)程,而是獨(dú)的進(jìn)程,而是shell程序的一部分。函數(shù)定義的基本格式為:程序的一部分。函數(shù)定義的基本格式為: functionname 若干命令行若干命令行 5.85.8函數(shù)函數(shù) 函數(shù)使用:函數(shù)使用: 1、調(diào)用函數(shù)之前,必須先定義函數(shù)。、調(diào)用函數(shù)之前,必須先定義函數(shù)。 2、函數(shù)的參數(shù)的傳遞:、函數(shù)的參數(shù)的傳遞:functionname para1 para2 . 3、在函數(shù)內(nèi)部參數(shù)的讀取:、在函數(shù)內(nèi)部參數(shù)的讀取: $0-$9 , $(所有參數(shù))(所有參數(shù)) $#(參數(shù)總個(gè)數(shù))(參數(shù)總個(gè)數(shù)) 4、函數(shù)的返回值:可

30、能使用、函數(shù)的返回值:可能使用return命令返回?cái)?shù)字值;要返回字符串值,命令返回?cái)?shù)字值;要返回字符串值,可以字符串保存在一個(gè)全局性的變量中,該變量在函數(shù)結(jié)束后能被外界使用;可以字符串保存在一個(gè)全局性的變量中,該變量在函數(shù)結(jié)束后能被外界使用;如果沒有使用如果沒有使用return命令,則函數(shù)返回值是函數(shù)中最后執(zhí)行的一條命令的命令,則函數(shù)返回值是函數(shù)中最后執(zhí)行的一條命令的退出狀態(tài)碼。退出狀態(tài)碼。 5、變量使用:函數(shù)內(nèi)部聲明的變量默認(rèn)為全局變量,使用、變量使用:函數(shù)內(nèi)部聲明的變量默認(rèn)為全局變量,使用local關(guān)鍵字聲關(guān)鍵字聲明的變量為局部變量(如明的變量為局部變量(如 local var=“var”

31、)。如果局部變量與全局變量)。如果局部變量與全局變量同名,則在函數(shù)內(nèi)部局部變量覆蓋全局變量。同名,則在函數(shù)內(nèi)部局部變量覆蓋全局變量。 6、返回值的獲取,當(dāng)執(zhí)行完函數(shù)后,函數(shù)的返回值被存放在、返回值的獲取,當(dāng)執(zhí)行完函數(shù)后,函數(shù)的返回值被存放在$?中,可以中,可以通過它來獲取函數(shù)的返回值。通過它來獲取函數(shù)的返回值。5.8 5.8 函數(shù)函數(shù) 舉例舉例#HELLO.shfunction hello( ) echo “hi” helloecho $?執(zhí)行結(jié)果如下執(zhí)行結(jié)果如下:# sh hello.shhi hi5.8 5.8 函數(shù)函數(shù) 舉例舉例#This is a example for testing

32、 the return value of functionfunction fun() return 10funecho $?exit 0執(zhí)行結(jié)果如下執(zhí)行結(jié)果如下:# sh fun.sh105.8 5.8 函數(shù)函數(shù) 舉例舉例#funsample1.shfunction add( ) declare -i sum sum=$1+$2 return $sumadd 10 20echo $?執(zhí)行結(jié)果如下執(zhí)行結(jié)果如下:# sh funsample1.sh305.8 5.8 函數(shù)函數(shù) 舉例舉例function find_file() if $# -lt 1 ;then return 1; fi if f

33、ind -name $1 print/dev/null then : else echo File $1 not found fi5.8 5.8 函數(shù)函數(shù) 舉例舉例 #_MAIN_ if $# -lt 1 ;then echo Usage: $0 filename return 1; fi for loop in $ do find_file $loop done5.8 5.8 函數(shù)函數(shù) 舉例舉例 #_MAIN_ if $# -lt 1 ;then echo Usage: $0 filename return 1; fi for loop in $ do find_file $loop don

34、e5.8 5.8 函數(shù)函數(shù) 舉例舉例 #test1.sh function hello() echo “hi” #test.sh #注意注意.后面要有一個(gè)空格后面要有一個(gè)空格 . test1.sh hello 執(zhí)行結(jié)果:執(zhí)行結(jié)果: hi5.9 5.9 命令分組命令分組 在在shell中有兩種命令分組的方法:中有兩種命令分組的方法:“()”和和“”,前者當(dāng),前者當(dāng)shell執(zhí)行執(zhí)行()中的命令時(shí)將再創(chuàng)建一個(gè)新的子進(jìn)程,然后這個(gè)子進(jìn)程去執(zhí)行圓括弧中的命令時(shí)將再創(chuàng)建一個(gè)新的子進(jìn)程,然后這個(gè)子進(jìn)程去執(zhí)行圓括弧中的命令。當(dāng)用戶在執(zhí)行某個(gè)命令時(shí)不想讓命令運(yùn)行時(shí)對(duì)狀態(tài)集合中的命令。當(dāng)用戶在執(zhí)行某個(gè)命令時(shí)不想

35、讓命令運(yùn)行時(shí)對(duì)狀態(tài)集合(如位置參數(shù)、環(huán)境變量、當(dāng)前工作目錄等如位置參數(shù)、環(huán)境變量、當(dāng)前工作目錄等)的改變影響到下面語句的的改變影響到下面語句的執(zhí)行時(shí),就應(yīng)該把這些命令放在圓括弧中,這樣就能保證所有的改變執(zhí)行時(shí),就應(yīng)該把這些命令放在圓括弧中,這樣就能保證所有的改變只對(duì)子進(jìn)程產(chǎn)生影響,而父進(jìn)程不受任何干擾;只對(duì)子進(jìn)程產(chǎn)生影響,而父進(jìn)程不受任何干擾;用于將順序執(zhí)行用于將順序執(zhí)行的命令的輸出結(jié)果用于另一個(gè)命令的輸入的命令的輸出結(jié)果用于另一個(gè)命令的輸入(管道方式管道方式)。當(dāng)我們要真正。當(dāng)我們要真正使用圓括弧和花括弧時(shí)使用圓括弧和花括弧時(shí)(如計(jì)算表達(dá)式的優(yōu)先級(jí)如計(jì)算表達(dá)式的優(yōu)先級(jí)),則需要在其前面加,則

36、需要在其前面加上轉(zhuǎn)義符上轉(zhuǎn)義符()以便讓以便讓shell知道它們不是用于命令執(zhí)行的控制所用。知道它們不是用于命令執(zhí)行的控制所用。5.10 Shell5.10 Shell程序調(diào)試程序調(diào)試 shell程序是一種解釋性語言,它的執(zhí)行是逐行進(jìn)行的,程序中是否有語程序是一種解釋性語言,它的執(zhí)行是逐行進(jìn)行的,程序中是否有語法錯(cuò)誤,不執(zhí)行到那一行系統(tǒng)是無法知道的。法錯(cuò)誤,不執(zhí)行到那一行系統(tǒng)是無法知道的。C,pascal等高級(jí)語言是有等高級(jí)語言是有編譯過程的,程序中的語法錯(cuò)誤在編譯階段就能檢測(cè)出來,因此比編譯過程的,程序中的語法錯(cuò)誤在編譯階段就能檢測(cè)出來,因此比shell更容易調(diào)試更容易調(diào)試shell程序通常

37、有三種調(diào)試方法:程序通常有三種調(diào)試方法: 1)交互式調(diào)試)交互式調(diào)試 shell程序中使用的命令都能在命令行中運(yùn)行,所以對(duì)于一些不很熟悉的程序中使用的命令都能在命令行中運(yùn)行,所以對(duì)于一些不很熟悉的命令和語法可以先用命令進(jìn)行驗(yàn)證,然后再編寫到命令和語法可以先用命令進(jìn)行驗(yàn)證,然后再編寫到shell程序中,這種調(diào)程序中,這種調(diào)試方法稱為交互式調(diào)試,也是最簡(jiǎn)單的一種調(diào)試方法。試方法稱為交互式調(diào)試,也是最簡(jiǎn)單的一種調(diào)試方法。 5.9 Shell5.9 Shell程序調(diào)試程序調(diào)試2)在編輯過程中不斷調(diào)試執(zhí)行所編輯的)在編輯過程中不斷調(diào)試執(zhí)行所編輯的shell程序程序 在在UNIX系統(tǒng)中可以打開多個(gè)工作窗口

38、。我們可以在一個(gè)窗口中用系統(tǒng)中可以打開多個(gè)工作窗口。我們可以在一個(gè)窗口中用vi等等編輯器進(jìn)行編輯,然后在另一個(gè)連接窗口中執(zhí)行該編輯器進(jìn)行編輯,然后在另一個(gè)連接窗口中執(zhí)行該shell程序,這樣可以程序,這樣可以隨時(shí)觀察到已經(jīng)編寫的部分是否正確。最終完成這個(gè)隨時(shí)觀察到已經(jīng)編寫的部分是否正確。最終完成這個(gè)shell程序的編寫。程序的編寫。3)用)用shell程序提供的跟蹤功能進(jìn)行調(diào)試程序提供的跟蹤功能進(jìn)行調(diào)試 shell程序可以使用程序可以使用 -v -x 選項(xiàng)對(duì)選項(xiàng)對(duì)shell程序進(jìn)行跟蹤程序進(jìn)行跟蹤-v:當(dāng)讀入:當(dāng)讀入shell輸入行時(shí)把它們顯示出來,完成詳細(xì)跟蹤。輸入行時(shí)把它們顯示出來,完成詳

39、細(xì)跟蹤。Shell程序在程序在完成這段程序執(zhí)行時(shí)首先逐行讀入執(zhí)行的命令,并在標(biāo)準(zhǔn)輸出上顯示該完成這段程序執(zhí)行時(shí)首先逐行讀入執(zhí)行的命令,并在標(biāo)準(zhǔn)輸出上顯示該命令要執(zhí)行的實(shí)際內(nèi)容,然后執(zhí)行該命令。如果沒有語法錯(cuò)誤,執(zhí)行將命令要執(zhí)行的實(shí)際內(nèi)容,然后執(zhí)行該命令。如果沒有語法錯(cuò)誤,執(zhí)行將一直進(jìn)行下去直到完成一直進(jìn)行下去直到完成shell的執(zhí)行。的執(zhí)行。 -x:執(zhí)行命令前先把命令和它們的參數(shù)顯示出來:執(zhí)行命令前先把命令和它們的參數(shù)顯示出來 5.9 Shell5.9 Shell程序調(diào)試程序調(diào)試假設(shè)有這么一個(gè)簡(jiǎn)單的假設(shè)有這么一個(gè)簡(jiǎn)單的shell,叫,叫test1.sh date echo $PATH我們用我們

40、用-v參數(shù)來調(diào)試參數(shù)來調(diào)試, 執(zhí)行執(zhí)行sh -v test1.sh那么輸出就應(yīng)該是:那么輸出就應(yīng)該是: date Mon Sep 8 9:55:01 Linux9 2003 echo $PATH /usr/bin:/usr/ucb/bin:/home/user1shell在執(zhí)行在執(zhí)行date前先顯示該命令然后顯示前先顯示該命令然后顯示date的執(zhí)行結(jié)果,接著顯示的執(zhí)行結(jié)果,接著顯示echo $PATH以及它的執(zhí)行結(jié)果。以及它的執(zhí)行結(jié)果。 如果用如果用-x參數(shù)來執(zhí)行這個(gè)參數(shù)來執(zhí)行這個(gè)shell,執(zhí)行,執(zhí)行 sh -x test1.sh則系統(tǒng)的輸出將是:則系統(tǒng)的輸出將是: +date Mon Se

41、p 8 9:55:01 Linux9 2003 +echo /usr/bin:/usr/ucb/bin:/home/user1 /usr/bin:/usr/ucb/bin:/home/user1 date這一行沒有參數(shù),所以只顯示命令這一行沒有參數(shù),所以只顯示命令 echo這一行有參數(shù)這一行有參數(shù)$path,被直接替換成了參數(shù)的值。,被直接替換成了參數(shù)的值。 5.9 Shell5.9 Shell程序調(diào)試程序調(diào)試在調(diào)試一個(gè)比較大的在調(diào)試一個(gè)比較大的shell時(shí),沒有必要對(duì)整個(gè)時(shí),沒有必要對(duì)整個(gè)shell程序都進(jìn)行跟程序都進(jìn)行跟蹤,可以只對(duì)其中較為負(fù)責(zé)的部分進(jìn)行跟蹤,這時(shí)可以通過蹤,可以只對(duì)其中較

42、為負(fù)責(zé)的部分進(jìn)行跟蹤,這時(shí)可以通過set v set +v或者或者set x set +x來把需要跟蹤的部分來把需要跟蹤的部分包含進(jìn)來。包含進(jìn)來。 5.10 Shell5.10 Shell編程示例編程示例1.使用使用forfor循環(huán)語句編寫循環(huán)語句編寫B(tài)shellBshell程序,完成顯示用戶注冊(cè)目錄下程序,完成顯示用戶注冊(cè)目錄下a_sub, b_suba_sub, b_sub子目錄下的所有子目錄下的所有C C程序源文件和目標(biāo)文件的列表程序源文件和目標(biāo)文件的列表 5.10 Shell5.10 Shell編程示例編程示例 # showCfile.sh # showCfile.sh if test

43、 -d if test -d $HOME/a_sub$HOME/a_sub then then echo - the .c and .obj echo - the .c and .obj files in $HOME/a_sub: files in $HOME/a_sub: - for filename in for filename in ls $HOME/a_subls $HOME/a_sub do do case $filename in case $filename in * *.c) echo $filename;.c) echo $filename; * *.obj.obj) ec

44、ho $filename; ) echo $filename; esac esac done done else else echo $HOME/a_sub does not exist! echo $HOME/a_sub does not exist! fi fi 5.10 Shell5.10 Shell編程示例編程示例 if test -d if test -d $HOME/b_sub$HOME/b_sub then then echo - the .c and .obj echo - the .c and .obj files in $HOME/b_sub: - files in $HO

45、ME/b_sub: - for filename in for filename in ls $HOME/b_subls $HOME/b_sub do do case $filename in case $filename in * *.c) echo $filename is a C source file!;.c) echo $filename is a C source file!; * *.obj.obj) echo $filename is an Object file!; ) echo $filename is an Object file!; esac esac done don

46、e else else echo $HOME/b_sub does not exist! echo $HOME/b_sub does not exist! fi fi5.10 Shell5.10 Shell編程示例編程示例2.連續(xù)輸入若干個(gè)名字到文件連續(xù)輸入若干個(gè)名字到文件s中保留中保留read read 當(dāng)當(dāng)BshBsh遇到一個(gè)遇到一個(gè)readread語句時(shí),在標(biāo)準(zhǔn)輸入文件中讀取數(shù)據(jù)直到一個(gè)語句時(shí),在標(biāo)準(zhǔn)輸入文件中讀取數(shù)據(jù)直到一個(gè)換行符。此時(shí)換行符。此時(shí)ShellShell在解釋輸入行時(shí),不進(jìn)行文件名或變量的替換,只是在解釋輸入行時(shí),不進(jìn)行文件名或變量的

47、替換,只是簡(jiǎn)單地刪除多余的空格。然后簡(jiǎn)單地刪除多余的空格。然后ShellShell將輸入行的第一個(gè)字的內(nèi)容給變量將輸入行的第一個(gè)字的內(nèi)容給變量1,1,第二個(gè)給變量第二個(gè)給變量2,2,直到所有變量都賦上值或是輸入行為空。若輸入行中字直到所有變量都賦上值或是輸入行為空。若輸入行中字的個(gè)數(shù)超過變量個(gè)數(shù),的個(gè)數(shù)超過變量個(gè)數(shù),ShellShell將把輸入行中剩余的所有字的內(nèi)容都賦給最將把輸入行中剩余的所有字的內(nèi)容都賦給最后一個(gè)變量。當(dāng)變量個(gè)數(shù)多于輸入行字的個(gè)數(shù)時(shí)候,多于的變量將賦一后一個(gè)變量。當(dāng)變量個(gè)數(shù)多于輸入行字的個(gè)數(shù)時(shí)候,多于的變量將賦一個(gè)空值。輸入行的每一個(gè)字是由空格分隔的一個(gè)字母和數(shù)字組成的字符

48、個(gè)空值。輸入行的每一個(gè)字是由空格分隔的一個(gè)字母和數(shù)字組成的字符串??梢酝ㄟ^重定向的方式從文件中讀字符串。串??梢酝ㄟ^重定向的方式從文件中讀字符串。5.10 Shell5.10 Shell編程示例編程示例 ans ans=yes=yes until until $ans$ans = no = no do do echo Enter a nameecho Enter a name read name read name echo $name secho $name s echo Continue?echo Continue? echo Enter yes or

49、noecho Enter yes or no read ansread ans donedone 5.10 Shell5.10 Shell編程示例編程示例3. 持續(xù)檢測(cè)文件持續(xù)檢測(cè)文件abc.txt是否存在是否存在5.10 Shell5.10 Shell編程示例編程示例 while test -r abc.txt while test -r abc.txt do do echo file abc.txt has not beed echo file abc.txt has not beed deleted !“ deleted !“ sleep 10 sleep 10 done done ec

50、ho file abc.txt has beed echo file abc.txt has beed deleted ! deleted !5.10 Shell5.10 Shell編程示例編程示例4. 統(tǒng)計(jì)文件統(tǒng)計(jì)文件file的行數(shù)的行數(shù)5.10 Shell5.10 Shell編程示例編程示例 count=0 count=0 while read LINE while read LINE do do count=expr count=expr $count + 1 $count + 1 done file done $1; 1) cat $1; 2) cat $2; 2) cat $2; 3

51、) cat $1 $2 $3; 3) cat $1 $2 $3; * *) echo To many param) echo To many param esac esacif test $# -eqif test $# -eq 1 1 then then cat$1 cat$1 elif elif $#=2 $#=2 then then cat $2 cat $2 elif elif $#=3 $#=3 then then cat $1 $2 $3 cat $1 $2 $3 else else echo “error” echo “error” fi fi5.10 Shell5.10 She

52、ll編程示例編程示例6.為了便于系統(tǒng)管理員對(duì)磁盤分配的管理,請(qǐng)編寫一段為了便于系統(tǒng)管理員對(duì)磁盤分配的管理,請(qǐng)編寫一段shell程序,程序,當(dāng)文件系統(tǒng)當(dāng)文件系統(tǒng)/home的占用空間量改變時(shí),給出相應(yīng)的信息提示。的占用空間量改變時(shí),給出相應(yīng)的信息提示。要求要求/home占用量在系統(tǒng)磁盤中為:占用量在系統(tǒng)磁盤中為:1)小于)小于50%時(shí),提示時(shí),提示“用戶系統(tǒng)文件磁盤使用負(fù)荷量小用戶系統(tǒng)文件磁盤使用負(fù)荷量小”。2)大于)大于50%,小于,小于90%時(shí),提示時(shí),提示“用戶文件系統(tǒng)磁盤使用負(fù)荷量用戶文件系統(tǒng)磁盤使用負(fù)荷量正常正?!?)大于)大于90%時(shí),提示時(shí),提示“用戶文件系統(tǒng)磁盤使用負(fù)荷量偏大用戶文

53、件系統(tǒng)磁盤使用負(fù)荷量偏大”。 5.10 Shell5.10 Shell編程示例編程示例bcbc 一個(gè)簡(jiǎn)單的計(jì)算器。一個(gè)簡(jiǎn)單的計(jì)算器。bcbc是一個(gè)支持交互的表達(dá)式計(jì)算的語言,是一個(gè)支持交互的表達(dá)式計(jì)算的語言,其格式類似于其格式類似于C C語言語言 輸入輸入bcbc,回車,就進(jìn)入,回車,就進(jìn)入bcbc的命令行,輸入一個(gè)的命令行,輸入一個(gè)C C格式的計(jì)算式格式的計(jì)算式 1 133333 3,回車得到結(jié)果,回車得到結(jié)果100100 命令行命令行 echo 1+33echo 1+33* *3 | bc3 | bc 也能計(jì)算出也能計(jì)算出1 133333 3100100。scale n 計(jì)算的精度計(jì)算的精

54、度 du 顯示文件或目錄所占的磁盤空間顯示文件或目錄所占的磁盤空間 -s 只顯示設(shè)定文件目錄的空間總量只顯示設(shè)定文件目錄的空間總量 -r 如果文件不能讀取,則顯示出提示信息如果文件不能讀取,則顯示出提示信息 -a 可以接收多個(gè)文件,并一一顯示所占的磁盤空間可以接收多個(gè)文件,并一一顯示所占的磁盤空間 5.10 Shell5.10 Shell編程示例編程示例 echo echo echo - Disk Usage Condition - echo - Disk Usage Condition - used_disk=duused_disk=du -s /home | cut -f1 -s /hom

55、e | cut -f1 echo Used Blocks: $used_disk echo Used Blocks: $used_disk free_disk=df | head 2 |tail -1 | trfree_disk=df | head 2 |tail -1 | tr -s | cut -f4 -d -s | cut -f4 -d echo Free Blocks: $free_disk echo Free Blocks: $free_disk total_disk=exprtotal_disk=expr $used_disk + $free_disk $used_disk + $

56、free_disk echo total blocks:$total_disk echo total blocks:$total_disk echo echo echo - disk usage ratio - echo - disk usage ratio -5.10 Shell5.10 Shell編程示例編程示例 # #計(jì)算出磁盤的利用率計(jì)算出磁盤的利用率 ratio=echo scale=6; $used_diskratio=echo scale=6; $used_disk* *100/$total_disk | bc100/$total_disk | bc echo -e usage

57、ratio: $ratio% echo -e usage ratio: $ratio% if expr if expr $ratio 50 $ratio 90 $ratio 90 then then echo echo 用戶文件系統(tǒng)磁盤使用負(fù)荷偏大用戶文件系統(tǒng)磁盤使用負(fù)荷偏大 else else echo echo 用戶文件系統(tǒng)磁盤使用負(fù)荷正常用戶文件系統(tǒng)磁盤使用負(fù)荷正常 fi fi echo echo5.10 Shell5.10 Shell編程示例編程示例7. 編寫一個(gè)編寫一個(gè)shellshell程序:根據(jù)從鍵盤輸入的學(xué)生成績(jī),顯示相應(yīng)的成程序:根據(jù)從鍵盤輸入的學(xué)生成績(jī),顯示相應(yīng)的成績(jī)標(biāo)準(zhǔn)績(jī)

58、標(biāo)準(zhǔn)。 echo -e Please enter the score: echo -e Please enter the score: while while read SCOREread SCORE do do case $SCORE in case $SCORE in ?|1-5? ) echo Failed! ?|1-5? ) echo Failed! echo Please enter the next score:; echo Please enter the next score:; 6?) echo Passed! 6?) echo Passed! echo Please ent

59、er the next score:; echo Please enter the next score:; 7?) echo Medium! 7?) echo Medium! echo Please enter the next score:; echo Please enter the next score:; 8?) echo Good! 8?) echo Good! echo Please enter the next score:; echo Please enter the next score:; 9?|100) echo Great! 9?|100) echo Great! echo Please enter the next score:; echo Please enter the next score:; * *) exit;)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論