第4章Shell編程.ppt_第1頁(yè)
第4章Shell編程.ppt_第2頁(yè)
第4章Shell編程.ppt_第3頁(yè)
第4章Shell編程.ppt_第4頁(yè)
第4章Shell編程.ppt_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Shell Programming, UNIX Shell程序設(shè)計(jì),Shell的雙重特性:,命令解釋程序(命令解釋器): Shell解釋用戶(hù)輸入的命令行,提交系統(tǒng)內(nèi)核 處理,并將結(jié)果返回給用戶(hù); Shell與UNIX命令一樣都是實(shí)用程序,但有區(qū) 別。一旦用戶(hù)注冊(cè)到系統(tǒng)后, Shell 就被系統(tǒng)裝 入內(nèi)存,并一直運(yùn)行到用戶(hù)退出系統(tǒng)之止;而一 般命令僅當(dāng)被調(diào)用時(shí),才由系統(tǒng)裝入內(nèi)存執(zhí)行。 程序設(shè)計(jì)語(yǔ)言: Shell本身也是一種可編程的程序設(shè)計(jì)語(yǔ)言。,做為用戶(hù)與Unix系統(tǒng)內(nèi)核之間的界面,Shell接受、解釋并執(zhí)行用戶(hù)命令。 Shell執(zhí)行用戶(hù)命令的工作過(guò)程大體上表現(xiàn)為這樣一個(gè)循環(huán): while (1

2、) prompt(“command: ”); /* 打印提示符 */ read(command); /* 讀入并分析命令 */ execute(command); /* 執(zhí)行命令 */ ,4.1 命令解釋程序,執(zhí)行一個(gè)shell命令行時(shí),通常會(huì)自動(dòng)打開(kāi)三個(gè)標(biāo)準(zhǔn)文件,即: 標(biāo)準(zhǔn)輸入文件(stdin),通常對(duì)應(yīng)終端的鍵盤(pán); 標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)錯(cuò)誤輸出文件(stderr),這兩個(gè)文件都對(duì)應(yīng)終端的屏幕。 進(jìn)程將從標(biāo)準(zhǔn)輸入文件中得到輸入數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯(cuò)誤信息送到標(biāo)準(zhǔn)錯(cuò)誤文件中。 以上三個(gè)標(biāo)準(zhǔn)文件的文件標(biāo)識(shí)符分別為0號(hào)、1號(hào)、2號(hào)。,4.1.1 輸入輸出重定向

3、,當(dāng)標(biāo)準(zhǔn)文件描述符被分配給終端以外的對(duì)象,就稱(chēng)為I/O重定向, 由 “”、 “” 、 “” 、“”等符號(hào)完成。,$ ls -l $ ls -l mydirlist $ pwd mydirlist $ pwd mydirlist $ date mydirlist $ cat file1 file2 file3,用 , 等符號(hào)改變標(biāo)準(zhǔn)流的方向,分析以下命令的結(jié)果:,$ ( ls l; pwd; date ) mydirlist,$ mail tom file $ myprog testdatafile $ command string ,為“行輸入重定向”,較少使用。,$ myprog outfi

4、le /*同時(shí)使用輸入輸出重定向 */,如果將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出流都定向到同一文件,B Shell中用2 分隔命令,標(biāo)志命令結(jié)束,但不換行 若errorfile不存在,則記下日期、時(shí)間并給出無(wú)錯(cuò)誤提示一并寫(xiě)入datelog中。,#!/bin/sh # 例2 checkerr.sh date datelog if test -r errorfile then cat errorfile datelog rm errorfile else echo “No error this hour.” datelog fi,例3:,# !/bin/sh # 例3 根據(jù)一天中的不同鐘點(diǎn)給出不同的問(wèn)候消息

5、hours=date | cut -c12-13 if $hour -lt 12 then echo “Good morning !” else if $hour -lt 18 then echo “Good afternoon !” else echo “Good evening !” fi fi,2)case分支:實(shí)現(xiàn)多選一控制結(jié)構(gòu)的另一種方法,語(yǔ)法:case word in pattern 1) pat1 -list1; pattern 2) pat2 -list2; *) default -list; esac,其中:word將與各匹配模式比較,“;”符表示匹配結(jié)束,“*”號(hào)為通配符。

6、,#! /bin/sh echo -n “Which color do you like?” read color case “$color” in Bbl?) echo I feel the sky is $color ; Ggree*) echo $color is for trees ; red | orange) echo $color is very warm! ; *) echo No such color as $color; esac echo “Out of case”,case “$choice” in 1) TERM=vt120 export TERM ; 2) TERM

7、=AT386 export TERM ; 3) TERM=sun export TERM ; esac echo “TERM is $TERM.”,4.2.5 循環(huán)語(yǔ)句,循環(huán)語(yǔ)句完成命令的重復(fù)執(zhí)行,1)for 循環(huán), 常用于循環(huán)次數(shù)確定的情況 語(yǔ)法:for var in word1 word2 wordn do commands done 當(dāng)變量值在列表中,執(zhí)行一次所有命令,使用變量名訪問(wèn)列表中取值。in 列表可選,如果不用它,則for循環(huán)使用腳本運(yùn)行的位置參數(shù)。 for 循環(huán)中可根據(jù)需要進(jìn)行嵌套,例1:列出用戶(hù)注冊(cè)目錄下的cc和work子目錄中所有 .c 和 .h文件。,# !/ bin/s

8、h # 顯示.c和.h文件 cd $HOME for dir in cc work do echo “.in $dir.” cd $dir for file in *.ch do ls -l $file done cd done,2) while 循環(huán),以命令表的出口狀態(tài)為判別條件,決定循環(huán)體中的命令是否執(zhí)行。語(yǔ)法結(jié)構(gòu): while 條件表達(dá)式 do cmdlist done,格式 : until 條件表達(dá)式 do cmdlist done,3) until 循環(huán),until與while循環(huán)的差別在于: 對(duì)于循環(huán)出口狀態(tài)的判定采取不同的處理策略,#!/bin/sh while $# -gt 0

9、 do echo $* shift done,$ ./scriptname a b c d e a b c d e b c d e c d e d e e,#!/bin/sh until who | grep linda do sleep 10 done talk lindadragonwings,break 命令 break是Shell的內(nèi)部命令,用于在循環(huán)體中根據(jù)命令運(yùn)行的返回條件,直接終止循環(huán)體內(nèi)命令的執(zhí)行。當(dāng)執(zhí)行break命令時(shí),控制流從循環(huán)體中轉(zhuǎn)移到done之后的第一條命令上。 continue 命令 continue也是Shell的內(nèi)部命令,用于在循環(huán)體中根據(jù)命令運(yùn)行的返回條件,直

10、接進(jìn)入下一次循環(huán)命令的執(zhí)行。當(dāng)執(zhí)行continue命令時(shí),控制流直接轉(zhuǎn)到本循環(huán)體中第一條命令上。,4.2.6 改變循環(huán),while true do echo “Are you ready to move on?” read answer if “$answer” = Y -o “$answer” = y then break else #commands fi done print “Here we go ”,#!/bin/sh for name in cat maillist do if “$name” = “richard” then continue else mail $name me

11、mo fi done,4.2.7 Shell 函數(shù),函數(shù)定義 函數(shù)調(diào)用 參數(shù)傳遞 函數(shù)文件 函數(shù)的載入和刪除 函數(shù)返回狀態(tài),函數(shù)定義:,3)函數(shù)允許將一組命令集或語(yǔ)句形成一個(gè)可用塊,這些塊稱(chēng)為shell函數(shù)。,3)定義函數(shù)的格式為: 函數(shù)名 ( ) 命令1 命令2 ,function 函數(shù)名 ( ) 命令1 命令2 ,#!/bin/bash #hellofunc function hello( ) echo “Hello, today is date” return 0 ,函數(shù)可以放在同一個(gè)文件中作為一段代碼,也可以放在只包含函數(shù)的單獨(dú)文件中。,#!/bin/bash #func functi

12、on hello( ) echo “Hello, today is date” echo “now going to the function hello” hello echo “back from the function”,函數(shù)調(diào)用:,#!/bin/bash #func function hello( ) echo “Hello, $1, today is date” echo “now going to the function hello” hello myfriend echo “back from the function”,參數(shù)傳遞:,向函數(shù)傳遞參數(shù),與在腳本中使用位置變量$1

13、, $2, $9 類(lèi)似。,#!/bin/bash #func #source function . hellofunc echo “now going to the function hello” hello echo “back from the function”,函數(shù)文件:,#!/bin/bash #hellofunc function hello( ) echo “Hello, today is date” return 0 ,#!/bin/bash #func #source function . hellofunc echo “now going to the function h

14、ello” hello echo $? echo “back from the function”,函數(shù)返回狀態(tài)值:,#!/bin/bash #hellofunc function hello( ) echo “Hello, today is date” return 0 ,4.2.8 Shell 程序的調(diào)試,1)交互調(diào)試 先用命令驗(yàn)證,再引入shell編程中,2)在編輯過(guò)程中執(zhí)行程序 打開(kāi)多個(gè)窗口,邊編輯邊執(zhí)行,3)用shell程序跟蹤執(zhí)行 使用shell的 -v,-x選項(xiàng)可對(duì)shell程序進(jìn)行跟蹤,我們可以了解到,在Shell程序設(shè)計(jì)語(yǔ)言里的基本操作仍然是UNIX系統(tǒng)命令,它是UNIX系統(tǒng)

15、中最有生氣的部分,而且對(duì)于UNIX系統(tǒng)的使用極為重要。,運(yùn)行級(jí)別腳本介紹,運(yùn)行級(jí)別 inittab 啟動(dòng)應(yīng)用程序,Linux啟動(dòng)流程,從BIOS到KERNEL MBRKERNELKERNEL自解壓內(nèi)核初始化內(nèi)核啟動(dòng)(start_kernel函數(shù),在linux內(nèi)核源代碼樹(shù)的/usr/src/linux/init/main.c中) 2. 內(nèi)核啟動(dòng):創(chuàng)建1進(jìn)程并執(zhí)行,由它創(chuàng)建若干內(nèi)核線程(kernel thread),然后裝入并執(zhí)行程序/sbin/init(變成一個(gè)用戶(hù)進(jìn)程)。此后,init根據(jù)/etc/inittab配置文件來(lái)執(zhí)行相應(yīng)的腳本進(jìn)行系統(tǒng)初始化,如設(shè)置鍵盤(pán)、字體,裝載模塊,設(shè)置網(wǎng)絡(luò)等 對(duì)

16、于Redhat來(lái)說(shuō),執(zhí)行的順序?yàn)椋?/etc/rc.d/rc.sysinit #由init執(zhí)行的第一個(gè)腳本 /etc/rc.d/rc$RUNLEVEL#$RUNLEVEL為缺省的運(yùn)行模式 /etc/rc.d/rc.local #運(yùn)行模式2、3、5時(shí)會(huì)運(yùn)行的腳本 /sbin/mingetty(或getty)#等待用戶(hù)登錄 /etc/inittab中指定了系統(tǒng)的運(yùn)行級(jí)別(RUNLEVEL),init根據(jù)運(yùn)行級(jí)別啟動(dòng)相關(guān)的服務(wù)(一些后臺(tái)進(jìn)程),實(shí)現(xiàn)不同的功能。 RUNLEVEL:06 0:halt, 1:?jiǎn)斡脩?hù),2:多用戶(hù),3:多用戶(hù)并啟動(dòng)NFS服務(wù) 4:保留,5:運(yùn)行xdm(X window)以圖

17、形界面方式登錄 6:reboot,運(yùn)行級(jí)別,運(yùn)行級(jí)別目錄 (/etc/rcN.d) 當(dāng)前運(yùn)行級(jí)別(runlevel) 運(yùn)行級(jí)別目錄的文件格式 (SXXscript, KXXscript),inittab,運(yùn)行級(jí)別控制文件 (/etc/inittab) 修改inittab文件,/etc/inittab 的書(shū)寫(xiě)格式: Id:runlevels:action:process Id:惟一標(biāo)志字段,2-4個(gè)字符長(zhǎng) runlevels:定義本行適用運(yùn)行等級(jí) action:采取的行動(dòng) process:應(yīng)該運(yùn)行的進(jìn)程,多個(gè)運(yùn)行等級(jí)可以寫(xiě)在一起: 如:id:13:action:process arguments 動(dòng)作選項(xiàng):,inittab中:si:sysinit:/etc/rc.d/rc.sysinit, 這個(gè)腳本優(yōu)于其它進(jìn)程運(yùn)行 設(shè)置:主機(jī)名稱(chēng),啟動(dòng)交換分區(qū),檢查文件系統(tǒng),

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論