《unix-os教學課件》第五章-shell程序設(shè)計_第1頁
《unix-os教學課件》第五章-shell程序設(shè)計_第2頁
《unix-os教學課件》第五章-shell程序設(shè)計_第3頁
《unix-os教學課件》第五章-shell程序設(shè)計_第4頁
《unix-os教學課件》第五章-shell程序設(shè)計_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 shell程序設(shè)計1、SHELL編程的基本知識;2、最基本的輸出命令和讀入命令;3、test命令的使用;4、算數(shù)運算expr命令和let命令;5、條件控制語句:if和case;6、循環(huán)語句:while、for、until7、shell函數(shù)8、shell程序的調(diào)試方法理解掌握掌握掌握掌握掌握重點、考點掌握理解5.1 shell的基本知識Shell程序可完成的工作完成需要自動循環(huán)執(zhí)行或是需要復雜命令操作才能完成的任務系統(tǒng)管理員實現(xiàn)系統(tǒng)中的各種管理任務腳本的概念無需編譯,解釋執(zhí)行文本文件形式存在支持強大的正則表達式操作運行速度慢數(shù)據(jù)類型支持少用于系統(tǒng)管理和文件操作常用的腳本語言tcl、pyt

2、hon、perl5.1 shell的基本知識Shell程序的編寫格式首先說明使用的是什么shell注明該腳本的內(nèi)容功能、操作系統(tǒng)版本信息、文件創(chuàng)建者等注明每個功能模塊的功能后綴名最好寫為.sh#!/bin/bash#example of until-do-done, 打印10次循環(huán)#2008-3-21#written by mjliu#! /bin/bash#! /bin/sh # # 本程序說明#command_1 command_2 # command_2的語句說明# 下面程序段的說明command_mcommand_n # command_n語句的說明告訴OS用哪種類型的shell來解釋

3、執(zhí)行該程序說明性語句(注釋)注釋行可以出現(xiàn)在程序中的任何位置,既可以單獨占用一行, 也可以接在執(zhí)行語句的后面. 以#號開始到所在行的行尾部分,都不被解釋執(zhí)行. 例如:第十次課內(nèi)容回顧shell變量變量置換、預定義變量、位置參數(shù)變量shell腳本的基本知識腳本語言與編譯語言的區(qū)別腳本程序的編寫風格#! /bin/bash注釋用#號開始每句shell語言結(jié)尾不需要符號分割5.1 shell的基本知識Shell程序的運行方式利用輸入/輸出重定向的方式完成作為bash命令的參數(shù)運行點(.)命令能夠使用戶在當前shell中執(zhí)行程序,而不創(chuàng)建子進程添加可執(zhí)行權(quán)限后運行通過在PATH變量添加路徑后,直接運行

4、bash 文件名bash 文件名. 文件名./文件名演示注意:點命令執(zhí)行方式與其他幾種的區(qū)別Shell程序的運行方式示例rootstu1 unix_2010# bash zhihuan.shdir= a= word=/rootrootstu1 unix_2010# bash cread num1 num2 num3if test $num1 -gt $num2 -a $num2 -gt $num3then echo the largest number is: $num1elif test $num2 -gt $num1 -a $num2 -gt $num3then echo the larg

5、est number is: $num2else echo the largest number is: $num3fiecho Done! :)echoexit 0一個較為復雜的程序假設(shè)大家已經(jīng)熟悉netstat命令和grep命令,現(xiàn)要檢測主機上的端口是否開啟(ftp),可以使用我們給出的范例例子:7.4_shell.shftp=netstat -an|grep LISTEN|grep :21www=netstat -an|grep LISTEN|grep :80算術(shù)運算expr命令用于計算表達式的值,能夠?qū)?shù)字或非數(shù)字字符串進行計算算術(shù)運算符:+ - * /rootlocalhost ro

6、ot# expr 1 + 21+2rootlocalhost root# expr 1 + 23rootlocalhost root# expr 15 - 69rootlocalhost root# expr 2.4 - 1expr: non-numeric argumentrootlocalhost root# expr 10 / 25rootlocalhost root# expr 10 * 220rootlocalhost root# expr 10 % 31算術(shù)運算的參數(shù)是整數(shù)表達式的元素之間必須有空格算術(shù)運算的商是取整*和%是特殊字符,要取消其特殊含義# num=9# sum=exp

7、r $num * 6 # echo $sum54反撇號引用命令的運行結(jié)果關(guān)系運算符expr命令提供用于數(shù)字和非數(shù)字參數(shù)的關(guān)系運算符如果是數(shù)字,則比較數(shù)值(如果是非數(shù)字的,則比較ASCII值比較結(jié)果為真,expr顯示1;結(jié)果為假,expr顯示為0關(guān)系運算符:等于(=)、不等于(!=)、小于()、小于等于()、大于等于(=)rootlocalhost mjliu# expr Gabe = gabe0rootlocalhost mjliu# expr Gabe = Gabe1rootlocalhost mjliu# expr 10 201rootlocalhost mjliu# expr 5 a (

8、注意5后面的空格)1算術(shù)運算符:let命令let命令可用于處理整數(shù)運算rootlocalhost mjliu# x=100rootlocalhost mjliu# let x=x + 1rootlocalhost mjliu# echo $x101rootlocalhost mjliu# let y=x*2rootlocalhost mjliu# echo $y202不需要加$,就可以引用變量不需要用對*和%進行轉(zhuǎn)意5.5 shell程序控制shell 程序由若干條shell語句構(gòu)成。shell語句包括三大類: 功能性語句、結(jié)構(gòu)性語句和說明性語句。說明性語句:以#號開始到行尾的部分,不被解釋執(zhí)

9、行;功能性語句:任意的操作系統(tǒng)命令、shell內(nèi)部命令、自編程序、其它shell程序名等;結(jié)構(gòu)性語句:條件測試語句、多路分支語句、循環(huán)語句、循環(huán)控制語句等。終止程序:exit命令exit命令用于終止shell程序的執(zhí)行格式:exit n#n是退出狀態(tài)(返回碼),如果沒有n,則返回執(zhí)行的最后一條命令的退出值5.6 條件控制:if和case語句條件語句語法結(jié)構(gòu): if 表達式 then 命令表 fi 如果表達式為真, 則執(zhí)行命令表中的命令;否則退出if語句, 即執(zhí)行fi后面的語句;if和fi是條件語句的語句括號,必須成對使用;命令表中的命令可以是一條,也可以是若干條。表達式外面的方括號是比不可少的

10、,條件前后必須加空格if-then-fi 例子例子: shell程序6_shell.sh, 命令行參數(shù)是否為已存在的文件或目錄名. 6_shell.sh#! /bin/bash if -f $1 then echo File $1 existsfi if -d $HOME/$1 then echo File $1 is a directoryfiif-then-fi 的運行結(jié)果rootstu1 no11# ./6_shell.sh 6.1_shell.shFile 6.1_shell.sh existsrootstu1 no11# ./6_shell.sh no11File no11 is a

11、 directoryif-then-else-fi 語句語法結(jié)構(gòu)為: if 表達式 then 命令表1 else 命令表2 fi如果表達式為真, 則執(zhí)行命令表1中的命令, 退出if語句; 否則執(zhí)行命令表2中的語句, 退出if語句。if-then-else-fi 例子例子:shell程序6.1_shell.sh,測試輸入的字符串是否是已存在的文件或目錄名. #! /bin/bash echo input a filename:read filename if -d $filename then echo File $filename is a directoryelse if -f $filen

12、ame then echo File $filename exists else echo unknown fifi注釋語句判斷輸入字符串是否為一個目錄名判斷輸入字符串是否為一個文件名test語句的縮寫 man testif-then-else-fi 運行結(jié)果rootstu1 no11# ./6.1_shell.shinput a filename:5.2_shell.shFile 5.2_shell.sh existsrootstu1 no11# ./6.1_shell.shinput a filename:./no13unknownrootstu1 no11# ./6.1_shell.sh

13、input a filename:./no8File ./no8 is a directoryif-then-elif-then-else-fi 語句語法結(jié)構(gòu)為: if 表達式1 then 命令表1 elif 表達式2 then 命令表2 else 命令表3 fi如果表達式1為真, 則執(zhí)行命令表1中的命令, 退出if語句; 否則判斷表達式2為真,則執(zhí)行命令行2中的語句;否則執(zhí)行命令行3,退出if語句。if-then-elif-then-else-fi 例子根據(jù)系統(tǒng)時間判斷當前是上午、下午或者晚上例子:6.2_shell.shhour=date +%H echo $hour if $hour -

14、lt 10 then echo GOOD MORNINGelif $hour -lt 18 then echo GOOD AFTERNOONelse echo GOOD EVENINGficase語句case語句語法case 值 in模式1)命令1;模式2)命令2;模式3)命令3;esac多路分支語句case用于多重條件測試case語句只能檢測字符串變量各模式中可用文件名元字符,以右括號結(jié)束命令表以單獨的雙分號行結(jié)束, 退出case語句模式 n常寫為字符* 表示所有其它模式最后一個雙分號行可以省略例子: 12.1_shell.sh12.1_shell.shecho do you like li

15、nux?read like_itcase $like_it iny|Y|Yes) echo linux is a good friend of us;n|N|No) echo try it, and you will like it;*) echo your answer is: $like_it;esac程序12.2_shell.sh檢查用戶輸入的文件名bash 12.2_shell.sh string name# The statement of caseesacif $# -eq 0 thenecho No argument is declaredexitficase $1 infile

16、1)echo User selects file1;file2)echo User selects file2;*)echo You must select either file1 or file2!;esac例子: 12.2_shell.sh5.7 循環(huán)結(jié)構(gòu)for循環(huán)語法for 變量 in 變量列表do 命令done依次取出變量列表中的值,賦給變量,然后執(zhí)行命令。循環(huán)體中命令執(zhí)行的次數(shù)和變量列表中元素的個數(shù)相等例子:8.1_shell.shfor os in Linux windows Unixdo echo os is $osdone for count in 1 2 4 3do ech

17、o $countdoneos is Linuxos is windowsos is Unix1243for-in-do-done 循環(huán)的例子包含for語句的程序8.2_shell.sh拷貝當前目錄下的所有文件到backup子目錄下。使用語法及程序為:If ! -d $HOME/backup thenmkdir $HOME/backupfiflist=lsfor file in $flistdoif $# = 1 thenif $1 = $file thenecho $file found ; exitfielsecp $file $HOME/backupecho $file copiedfid

18、oneecho *Back up completed*flist的值是ls的執(zhí)行結(jié)果即當前目錄下的文件名命令行上有一個參數(shù)時命令行上不帶參數(shù)時5.7 循環(huán)結(jié)構(gòu):while-do-done 循環(huán)while 條件 do命令donewhile循環(huán)語法只要while的循環(huán)條件為真,循環(huán)體中的命令就重復執(zhí)行,因此為了終止循環(huán),循環(huán)條件必須最終變?yōu)榧賚oop=0while $loop -lt 10 do let loop=loop+1 echo current value of loop is: $loopdone例子:9.1_shell.sh5.7 循環(huán)結(jié)構(gòu):until-do-done 循環(huán)until循

19、環(huán)語法until 條件 do命令doneuntil循環(huán)與while循環(huán)的功能相似, 所不同的是只有當測試的命令或表達式的值是假時, 才執(zhí)行循環(huán)體中的命令表, 否則退出循環(huán)。這一點與while命令正好相反。例子:10.1_shell.shloop=0until $loop -ge 10 do let loop=loop+1 echo current value of loop is: $loopdone循環(huán)控制語句 break 和 continuebreak語句從包含該語句的最近一層循環(huán)中跳出一層, break n 則跳出n層; continue語句則馬上轉(zhuǎn)到最近一層循環(huán)語句的下一輪循環(huán)上, c

20、ontinue n則轉(zhuǎn)到最近n層循環(huán)語句的下一輪循環(huán)上。例子: 11.1_shell.sh包含while、until和break語句的程序?qū)嵗?1.1_shell.shwhile truedoecho level1until falsedoecho level2while truedoecho level3breakdonedonedonewhile語句后的表達式為true(真), until語句后的表達式為false(假), 循環(huán)條件永遠成立, 因此是無限循環(huán)死循環(huán)程序, 只能由人工中斷如果改為break 3跳出最外層循環(huán)改為continue 3開始最外層循環(huán)For循環(huán)較為復雜的例子實例:

21、程序11_shell.sh的用法為: 11_shell.sh 整數(shù) 整數(shù) 整數(shù) 參數(shù)個數(shù)不確定, 范圍為110個, 每個參數(shù)都是正整數(shù),統(tǒng)計命令行參數(shù)值為偶數(shù)的參數(shù),把這些參數(shù)放到一個隊列中if $# = 0 thenecho Numeric arguments requiredexitfiif $# -gt 10 thenecho Only ten arguments allowedexitfifor numberdocount=expr $number % 2if $count -eq 1 thencontinueelseoutput=$output $numberfidoneecho E

22、ven numbers: $output 取所有位置參數(shù)用2求模, count的值只能是0或1下輪循環(huán)是奇數(shù)偶數(shù)放到偶數(shù)隊列中如何構(gòu)造一個隊列5.8 shell函數(shù)在shell程序中, 常常把完成固定功能、且多次使用的一組命令(語句)封裝在一個函數(shù)里,每當要使用該功能時只需調(diào)用該函數(shù)名即可。函數(shù)在調(diào)用前必須先定義,即在順序上函數(shù)說明必須放在調(diào)用程序的前面。調(diào)用程序可傳遞參數(shù)給函數(shù), 函數(shù)可用return語句把運行結(jié)果返回給調(diào)用程序。函數(shù)只在當前shell中起作用, 不能輸出到子shell中。5.8 shell函數(shù)函數(shù)格式: function_name ( ) command1 commandn 函數(shù)調(diào)用格式:function_name arg1 arg2 實例:check_user( ) #查找已登錄的指定用戶 user=who | grep $1 if -n $user then return 1 #找到指定用戶 else return 0 #未找到指定用戶 fiwhile true # MAIN,

溫馨提示

  • 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

提交評論