嵌入式操作系統(tǒng):第5章 Linux Shell編程_第1頁
嵌入式操作系統(tǒng):第5章 Linux Shell編程_第2頁
嵌入式操作系統(tǒng):第5章 Linux Shell編程_第3頁
嵌入式操作系統(tǒng):第5章 Linux Shell編程_第4頁
嵌入式操作系統(tǒng):第5章 Linux Shell編程_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章LinuxShell編程本章教學(xué)目的及要求掌握shell編程的一般方法。了解shell高級編程技術(shù)及shell腳本的調(diào)試方法。Shell是什么?Shell原意為外殼,用來形容物體外部的架構(gòu),Linux系統(tǒng)的Shell作為操作系統(tǒng)的外殼,保護其內(nèi)部的核(Kernel)。5.1Shell簡介Shell是什么

具體來講,Linux系統(tǒng)的Shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口。它是命令語言、命令解釋程序及程序設(shè)計語言的統(tǒng)稱。1.Shell可稱為命令解釋器:

負(fù)責(zé)用戶和操作系統(tǒng)之間的溝通,把用戶下達的命令解釋給系統(tǒng)去執(zhí)行,并將系統(tǒng)傳回的信息再次解釋給用戶,所以,它擁有自己內(nèi)建的Shell命令集,也能被系統(tǒng)中其他應(yīng)用程序調(diào)用。2.Shell還是一種高級程序設(shè)計語言:

它有變量、關(guān)鍵字,有各種控制語句,如if、case、while、for等語句,有自己的語法結(jié)構(gòu)。利用Shell程序設(shè)計語言可以編寫出功能強大的代碼程序。Shell解析命令過程Shell命令的兩種形式:

在Shell中,有一些命令(比如改變工作目錄命令cd)是包含在Shell內(nèi)部的。還有一些命令(例如拷貝命令cp和移動命令rm)是存在于文件系統(tǒng)中某個目錄下的單獨的程序,如/bin目錄中。對用戶而言,不必關(guān)心一個命令是建立在Shell內(nèi)部還是一個單獨的程序。內(nèi)部命令:.、alias、bg、cd、continue、echo、exec、exit、fg、jobs、pwd、set、shift、test、time、umask、unset和wait。外部命令:grep、more、cat、mkidr、rmdir、ls、sort、ftp、telnet、lp和ps

Shell接到用戶輸入的命令后首先檢查命令是否是內(nèi)部命令,若不是再檢查是否是一個應(yīng)用程序。然后,Shell在搜索路徑里尋找這些應(yīng)用程序(搜索路徑就是一個能找到可執(zhí)行程序的目錄列表)。如果鍵入的命令不是一個內(nèi)部命令并且在路徑里沒有找到這個可執(zhí)行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內(nèi)部命令或應(yīng)用程序?qū)⒈幌到y(tǒng)傳送給Linux內(nèi)核。Shell解析命令過程常用的Shell1.Shell種類

Linux中的Shell有多種類型,其中最常見的是BourneShell(sh)、CShell(csh)和KornShell(ksh)。三種Shell各有優(yōu)缺點。BourneShell是Unix最初始的Shell,并且在每種Unix上都可以使用。BourneShell在Shell編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面做得不如其他幾種Shell。1.Shell種類Linux中的Shell有多種類型,其中最常見的是BourneShell(sh)、CShell(csh)和KornShell(ksh)。三種Shell各有優(yōu)缺點。BourneShellCshell是一種比Bourneshell更適于編程的shell,它的語法與C語言很相似。Tcsh是Cshell的一個擴展版本。Tcsh包括命令行編輯、可編程單詞補全、拼寫校正、歷史命令替換、作業(yè)控制和類似C語言的語法,它不僅和Bashshell是提示符兼容,而且還提供比Bashshell更多的提示符參數(shù)。1.Shell種類Linux中的Shell有多種類型,其中最常見的是BourneShell(sh)、CShell(csh)和KornShell(ksh)。三種Shell各有優(yōu)缺點。BourneShellCshellKornshell集合了Cshell和Bourneshell的優(yōu)點并且和Bourneshell完全兼容。Linux系統(tǒng)提供了pdksh(ksh的擴展),它支持任務(wù)控制,可以在命令行上掛起、后臺執(zhí)行、喚醒或終止程序。1.Shell種類(1)查看目前Shell版本和linux可用版本($SHELL,/etc/shells)。

用戶默認(rèn)選擇的shell版本可以在/etc/passwd設(shè)定。(2)臨時改變Shell版本為csh。

[root@BC:root]#csh

[root@BC:~]# csh的提示符為“[root@BC:~]#”,退出Shell使用命令exit。常用的Shell2.Bash

Bash(BourneAgainShell)是BourneShell的擴展,與BourneShell完全向下兼容,并且增加了許多特性。它還包含了很多CShell和KornShell中的優(yōu)點,有靈活和強大的編程接口,同時又有很友好的用戶界面。

常用的ShellBash是大多數(shù)Linux系統(tǒng)的默認(rèn)Shell。Bash有以下的優(yōu)點:1)補全命令。

在Bash命令提示符下輸入命令或程序名時,若沒有輸全命令或程序名,按“Tab”鍵,Bash將自動補全命令或程序名。2)通配符。

在Bash下可以使用通配符“*”和“?”?!?”可以替代多個字符,而“?”則替代一個字符。3)歷史命令。

Bash能自動跟蹤用戶每次輸入的命令,并把輸入的命令保存在歷史列表緩沖區(qū)中。常用的Shell--Bash4)別名。

在Bash下,可用alias和unalias命令給命令或可執(zhí)行程序起別名和刪除別名,這樣就可以用自己習(xí)慣的方式輸入命令。

例1:使用lm代替ls–l常用的Shell--Bash(5)輸入/輸出重定向。

輸入重定向用于改變命令的輸入,輸出重定向用于改變命令的輸出.系統(tǒng)默認(rèn)的輸入為鍵盤、輸出為顯示器,輸入/輸出重定向可以改變輸入輸出。 例2:輸出重定向

>>

表示追加常用的Shell--Bash(5)輸入/輸出重定向。 例3:輸入重定向

通過鍵盤輸入,輸入完成后按下CTRL+D常用的Shell--Bash6)管道。

管道用于將一系列的命令連接起來,也就是把前面命令的輸出作為后面命令的輸入。管道的命令是“|”。

例:catmydir.out|grep"test"|wc–l

命令演示:

last last|greproot last|greproot|wc-l

常用的Shell--Bash7)提示符。

Bash有兩級提示符。第一級提示符就是登錄Shell時見到的,默認(rèn)為“$”??梢酝ㄟ^重新給PS1變量賦值來改變第一級提示符。當(dāng)Bash需要進一步提示以便補全命令時,它會顯示第二級提示符。第二級提示符默認(rèn)為“>”,可以通過重新給PS2變量賦值來改變第二級提示符。一些特殊意義的字符也可以加入提示符賦值中。8)作業(yè)控制。

作業(yè)控制是指在一個作業(yè)執(zhí)行過程中,控制執(zhí)行的狀態(tài)??梢話炱鹨粋€正在執(zhí)行的進程,并在以后恢復(fù)執(zhí)行該進程。常用的Shell--Bash組合新命令shell腳本提供了文件名擴展字符通配符的使用直接使用shell的內(nèi)置命令echo,exit,pwd,kill靈活地使用數(shù)據(jù)流重定向,管道等結(jié)構(gòu)化的程序模塊流程控制:順序,分支,循環(huán)在后臺執(zhí)行命令&可配置的環(huán)境別名,提示符,環(huán)境變量設(shè)置等高級的編程語言shell腳本Shell的特點利用編輯器編輯腳本,將腳本命名為.sh(非必須)Shell腳本第一行總是以#!/bin/bash開頭,它通知系統(tǒng)以下的Shell程序使用系統(tǒng)上的BourneAgainShell來解釋。第二行注釋中寫入腳本名,第三行注釋開始寫入腳本功能—習(xí)慣。以下行進入腳本正式編寫編寫完后給腳本添加執(zhí)行權(quán)限:chmodu+xfirst運行腳本:./first怎樣寫Shell?一個簡單的shell程序$vifirst#!/bin/bash#Myfirstshellscript#clearecho"Hello,everybody!"注意:在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。5.2.1變量像高級程序設(shè)計語言一樣,shell也提供說明和使用變量的功能。shell變量可以保存諸如路徑名、文件名或者一個數(shù)字。對shell來講,所有變量的取值都是一個字符串。Shell程序采用$var的形式來引用名為var的變量的值。Shell有以下幾種基本類型的變量:

用戶定義的變量shell定義的環(huán)境變量位置參數(shù)預(yù)定義變量參數(shù)置換的變量5.2Shell編程基礎(chǔ)(1)用戶定義的變量變量名是以字母或下線符打頭的字母、數(shù)字和下線符序列,并且大小寫字母意義不同。定義變量并賦值的一般形式是:

變量名=字符串引用變量值:在變量名前加“$”如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應(yīng)該用雙引號把這個字符串括起來。例如:

#names=“ZhangsanLisiWangwu”

說明一個變量為只讀:

readonly變量名

顯示變量echo命令:顯示單個變量取值,并在變量名前加$,例如:$myvar="howareyou"$echo$myvar清除變量使用unset命令清除變量。unsetvarname顯示所有本地shell變量使用set命令顯示所有本地定義的shell變量 set(1)用戶定義的變量數(shù)學(xué)運算--$[]數(shù)學(xué)運算—expr#a=3#b=5#expr$a+$b#expr$a-$b#expr$a/$b#expr$a*$b變量默認(rèn)都只是當(dāng)前shell的局部變量,將變量成為公共變量的格式為:

export變量名也可以在給變量賦值的同時使用export命令:

export變量名=變量值使用export說明的變量,在shell以后運行的所有命令或程序中都可以訪問到(2)shell定義的環(huán)境變量shell在開始執(zhí)行時就已經(jīng)定義了一些和系統(tǒng)的工作環(huán)境有關(guān)的變量,這些變量用戶還可以重新定義。環(huán)境變量可以在命令行中設(shè)置,但用戶注銷時這些值將丟失,因此最好在.bash_profile或/etc/profile文件中設(shè)置環(huán)境變量。傳統(tǒng)上,所有環(huán)境變量均為大寫。設(shè)置環(huán)境變量

VARNAME=value;exportVARNAME顯示環(huán)境變量 使用env命令可以查看所有的環(huán)境變量。清除環(huán)境變量 使用unset命令清除環(huán)境變量。(2)shell定義的環(huán)境變量HOME:用于保存注冊目錄的完全路徑名PATH:用于保存用冒號分隔的目錄路徑名,shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執(zhí)行文件將被執(zhí)行。

$PATH=$HOME/bin:.:/bin:/usr/bin;exportPATHTERM:終端的類型。UID:當(dāng)前用戶的標(biāo)識符,取值是由數(shù)字構(gòu)成的字符串。PWD:當(dāng)前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。常用的shell環(huán)境變量PS1:主提示符,在特權(quán)用戶下,缺省的主提示符是“#”,在普通用戶下,缺省的主提示符是“$”。PS2:在shell接收用戶輸入命令的過程中,如果用戶在輸入行的末尾輸入“\”然后回車,或者當(dāng)用戶按回車鍵時shell判斷出用戶輸入的命令沒有結(jié)束時,顯示這個輔助提示符,提示用戶繼續(xù)輸入命令的其余部分,缺省的輔助提示符是“>”。IFS:IFS用作shell指定的缺省域分隔符。原理上講域分隔符可以是任意字符,但缺省通常為空格、tab鍵。LOGNAME:此變量保存登錄名。SHELL:SHELL變量保存缺省shell,通常在/etc/passwd中已設(shè)置常用的shell環(huán)境變量PS1中可用信息\$ 用$作為提示符\\ 顯示\\d 顯示當(dāng)前日期\h 顯示主機名\s 顯示shell名\t 顯示當(dāng)前時間(24)\T 顯示當(dāng)前時間(12)\@ 顯示當(dāng)前時間(AM/PM)\u 顯示用戶名\v 顯示bash的版本\W 顯示當(dāng)前工作目錄\w 顯示當(dāng)前工作路徑位置參數(shù)是一種在調(diào)用shell程序的命令行中按照各自的位置決定的變量,是在程序名之后輸入的參數(shù)。位置參數(shù)之間用空格分隔,shell取第一個位置參數(shù)替換程序文件中的$1,第二個替換$2,依次類推。$0是一個特殊的變量,它的內(nèi)容是當(dāng)前這個shell程序的文件名,所以,$0不是一個位置參數(shù),在顯示當(dāng)前所有的位置參數(shù)時是不包括$0的(3)位置參數(shù)表示腳本名稱傳遞個腳本的參數(shù)個數(shù)位置參數(shù)所有的參數(shù)值所有的參數(shù)值位置參數(shù)及其引用

exam1m1m2m3m4.$0$1$2$3$4$5$6$7$8…..

$0始終表示命令名或shell腳本名。shift:就把命令行上的實參向左移一位

命令行:ex7 A BC DE.

原位置參數(shù):$0 $1 $2$3

$4$5

移位后:

$0

$1$2$3$4

經(jīng)shift右移位置參數(shù)后,$0的值不會發(fā)生變化位置參數(shù)

預(yù)定義變量和環(huán)境變量相類似,也是在shell一開始時就定義了的變量,所不同的是,用戶只能根據(jù)shell的定義來使用這些變量,而不能重定義所有預(yù)定義變量都是由$符和另一個符號組成的,常用的shell預(yù)定義變量有:

$#:位置參數(shù)的數(shù)量

$*:所有位置參數(shù)的內(nèi)容

$?:命令執(zhí)行后返回的狀態(tài)

$$:當(dāng)前進程的進程號

$!:后臺運行的最后一個進程號

$0:當(dāng)前執(zhí)行的進程名

其中,"$?"用于檢查上一個命令執(zhí)行是否正確(在Linux中,命令退出狀態(tài)為0表示該命令正確執(zhí)行,任何非0值表示命令出錯)。

"$$"變量最常見的用途是用作臨時文件的名字以保證臨時文件不會重復(fù)(4)預(yù)定義變量

shell在遇到未設(shè)置的變量時,將其值作為空串處理。而在實際應(yīng)用中,對未設(shè)置的變量,用戶可以根據(jù)需要采用不同的處理方式,這可通過變量替換來實現(xiàn)。變量替換提供了三種功能:允許替換未設(shè)置變量的隱含值;允許對未設(shè)置變量賦值;在訪問未設(shè)置變量時,提示出錯信息。參數(shù)置換的變量參數(shù)置換的變量有四種,這些變量通常與某一個位置參數(shù)相聯(lián)系,根據(jù)指定的位置參數(shù)是否已經(jīng)設(shè)置來決定變量的取值,它們的語法和功能分別如下。a.變量=${參數(shù)-word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則用word置換。b.變量=${參數(shù)=word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則把變量設(shè)置成word然后再用word替換參數(shù)的值。注意,位置參數(shù)不能用于這種方式,因為在shell程序中不能為位置參數(shù)賦值。c.變量=${參數(shù)?word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則就顯示word并從shell中退出,如果省略了word,則顯示標(biāo)準(zhǔn)信息。這種方式常用于出錯指示。d.變量=${參數(shù)+word}:如果設(shè)置了參數(shù),則用word置換變量,否則不進行置換。參數(shù)置換的變量

變量=${參數(shù)-word}變量=${參數(shù)-word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則用word置換。參數(shù)置換的變量

變量=${參數(shù)=word}變量=${參數(shù)=word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則把變量設(shè)置成word然后再用word替換參數(shù)的值。注意,位置參數(shù)不能用于這種方式,因為在shell程序中不能為位置參數(shù)賦值。參數(shù)置換的變量

變量=${參數(shù)?word}變量=${參數(shù)?word}:如果設(shè)置了參數(shù),則用參數(shù)的值置換變量的值,否則就顯示word并從shell中退出,如果省略了word,則顯示標(biāo)準(zhǔn)信息。這種方式常用于出錯指示。參數(shù)置換的變量

變量=${參數(shù)+word}變量=${參數(shù)+word}:如果設(shè)置了參數(shù),則用word置換變量,否則不進行置換。 Shell中除使用普通字符外,還使用了一些特殊字符,它們有特定的含義,如通配符“*”和“?”、管道線(|)及單引號、雙引號等。5.2.2Shell特殊字符1.一般通配符

通配符用于模式匹配,如文件名匹配、路徑名搜索、字符串查找等。常用的通配符有四種: (1)*匹配任意字符0次或多次出現(xiàn)。例如,f*可以匹配以f打頭的任意字符串。但應(yīng)注意,文件名前面的圓點(.)和路徑名中的斜線(/)必須顯式匹配。 (2)?匹配任意一個字符,例如,f?匹配f1、fa、fb等,但不能匹配f、fabc、f12等。 (3)[]其中有一個字符組,它匹配該字符組所限定的任何一個字符。該字符組可以由直接給出的字符組成,也可以由表示限定范圍的起始字符、終止字符及中間一個連字符(-)組成。如,f[a-d]與f[abcd]作用相同。 (4)!表示不在一對方括號中所列出的字符。例如,f[!1—9].c表示以f打頭,后面一個字符不是數(shù)字1至9的.c文件名,它匹配fa.c、fb.c、fm.c等。2.模式表達式

模式表達式是那些包含一個或多個通配符的字。bash除支持一般通配符外,還提供了特有的擴展模式匹配表達式,如: (1)*(模式表):匹配給定模式表中“模式”的0次或多次出現(xiàn),各模式之間以“|”分開。例如,file*(.c|.o)將匹配文件file、file.c、file.o、file.c.c、file.o.o、file.c.o、file.o.c等,但不匹配file.h或file.s等。 (2)+(模式表)匹配給定模式表中“模式”的1次或多次出現(xiàn),各模式之間以“|”分開。例如,file+(.c|.o)匹配文件file.c、file.o、file.c.o、file.c.c等,但不匹配file。 (3)?(模式表):匹配模式表中任何一種“模式”的0次或1次出現(xiàn),各模式之間以“|”分開。例如,file?(.c|.o)只匹配file、file.c和file.o,它不匹配多個模式或模式的重復(fù)出現(xiàn),即不匹配file.c.c、file.c.0等。2.模式表達式

(4)@(模式表):僅匹配模式表中給定“模式”的一次出現(xiàn),各模式之間以“|”分開。例如,file@(.c|.0)匹配file.c和file.o,但不匹配file、file.c.c、file.c.o等。

(5)!(模式表):除給定模式表中的一個“模式”之外,它可以匹配其它任何東西。

模式表達式的定義是遞歸的,每個表達式中都可以包含一個或多個模式。例如file*(.[cho]|.sh)是合法的模式表達式。但在使用時應(yīng)注意,由于帶“*”和“+”的表達式可以匹配給定模式的組合,若利用此種表達式去刪除文件就存在危險,有可能誤將系統(tǒng)配置文件刪除。因此,必須小心使用。3.引用引用必要性在shell中所使用的許多特殊符號也可為其他目的所使用,因此當(dāng)不需要引用這些字符的特殊含義時,就必須引用加以刪除。shell引用類型:""雙引號''單引號`反引號\反斜線5.2.2Shell特殊字符雙引號(“”)

如果用雙引號“”將值括起來,則括起來的字符串允許出現(xiàn)空格、制表符和換行符等特殊字符,而且允許有變量替換。例1:

#MAIL=/var/mail/fk #var=″$MAILispathofmailbox″ #echo$var /var/mail/fkispathofmailbox例2: #str=″Thisis\nabook″ #echo$str Thisis abook

使用雙引號能消除被括在雙引號中的大部分特殊字符的含義,不能消除的字符有:$、`

、!、\。例1: #echo″Typea\$*,please″

Typea$*,please例2:

#echo“todayis`date`”

單引號(‘’) 使用單引號消除被括在單引號中的所有特殊字符的含義,即單引號表示內(nèi)容照原樣不動。例4:

#BOOK=″Englishbook″

#

MSG=′$BOOK′

#

echo$MSG-echo‘$MSG’ #$BOOK$MSG

例5:

#msg=′Todayis`date`′ #echo$msg

Todayis`date`反撇號(``) 當(dāng)一個字符串被括在反撇號“`”中時,該字符串將作為命令被shell解釋執(zhí)行,即用命令的執(zhí)行結(jié)果替換這個字符串本身。要注意反撇號與單引號的區(qū)別。例1: #lm=`pwd` #echo$lm

/root例2: #now=′date′ #echo$now

date

#now=`date` #echo$now

1998年10月28日星期三17時51分56秒CST例3: #echo“Hostname:`hostname`”$()的功能與``一樣例1: #now=$(date) #echo$now例2: #echo$(pwd)例3: #echo“Hostname:$(hostname)”轉(zhuǎn)義符(\) 使用轉(zhuǎn)義符消除單個字符的特殊含義,即將緊跟在轉(zhuǎn)義符后面的單個字符按字符本身的實際含義解釋。例1: #echoyourcostis$5.00 #echo“yourcostis$5.00” #echoyourcostis\$5.00例2:轉(zhuǎn)義符具有續(xù)行功能 #ls-l

#ls\ >-l大括號{}

引用變量的值時,可以用花括號{}將變量名稱括起來,使變量名稱與它的后續(xù)字符分隔開,如果緊跟在變量名稱后面的字符是字母、數(shù)字或下劃線時,必須要使用花括號。例1:

例2:1.測試命令在bash中,命令test用于計算一個條件表達式的值,它們經(jīng)常在條件語句和循環(huán)語句中被用來判斷某些條件是否滿足。test命令的語法格式:

testexpression

或者 [expression]例1:測試字符串。

//測試字符串8是否等于9

//$?表示上一條命令執(zhí)行后的返回值

//其值為假,返回1例2:測試字符串。

//省略“test”,改用中括號形式,注意中括號中的空格5.2.3Shell程序設(shè)計的流程控制留一個空格留一個空格1.測試命令 在test命令中,可以使用很多shell的內(nèi)部操作符。這些操作符如下:(1)數(shù)值運算符用于計算數(shù)值表達式test表達式|含義---------------------------------------------

int1-eqint2|當(dāng)int1等于int2時,返回True

int1-geint2|當(dāng)int1大于/等于int2時,返回True

int1-leint2|當(dāng)int1小于/等于int2時,返回True

int1-gtint2|當(dāng)int1大于int2時,返回True

int1-neint2|當(dāng)int1不等于int2時,返回True-----------------------------------------5.2.3Shell程序設(shè)計的流程控制1.測試命令(2)字符串操作符用于計算字符串表達式

test命令|含義-----------------------------------------

str1=str2|當(dāng)str1與str2相同時,返回True

str1!

=str2|當(dāng)str1與str2不同時,返回True

str|當(dāng)str不為空時,返回True

-nstr|當(dāng)str的長度大于0時,返回True

-zstr|當(dāng)str的長度是0時,返回True-----------------------------------------5.2.3Shell程序設(shè)計的流程控制1.測試命令(3)用于文件操作的操作符,檢查文件是否存在,文件類型等test表達式|含義------------------------------------------------

-dfile|當(dāng)file是一個目錄時,返回True

-ffile|當(dāng)file是一個普通文件時,返回True

-rfile|當(dāng)file是一個可讀文件時,返回True

-sfile|當(dāng)file文件長度大于0時,返回True

-wfile|當(dāng)file是一個可寫文件時,返回True

-xfile|當(dāng)file是一個可執(zhí)行文件時,返回True------------------------------------------------5.2.3Shell程序設(shè)計的流程控制1.測試命令例:判斷/etc是否為目錄。判斷用戶對目錄/etc是否有寫的權(quán)限5.2.3Shell程序設(shè)計的流程控制1.測試命令(4)shell的邏輯操作符用于修飾/連接包含整數(shù),字符串,文件操作符的表達式test表達式|含義----------------------------------------------

!expr|當(dāng)expr的值是False時,返回TrueExpr1-aexpr2|當(dāng)expr1,expr2值同為True時,返回TrueExpr1-oexpr2|當(dāng)expr1,expr2的值至少有一個為True時,返回True----------------------------------------------例:判斷file1存在且具有可寫的權(quán)限。$[-ffile1-a-wfile1]5.2.3Shell程序設(shè)計的流程控制雙分支if[條件]then

語句

else

語句

fi多分支

if[條件];then

語句

elif[條件];then

語句

else

語句

fi注意:[條件]中,條件前后必須留有一個空格[

條件

];then連在一起寫,必須加上分號;2.if條件語句單分支

if[條件]then語句fi或者

if[條件];then語句fi例1:顯示目錄內(nèi)是否有example_if文件。2.if條件語句例2:若命令行的第一個參數(shù)為v則顯示AAAA,否則顯示BBBB。2.if條件語句例3:利用位置參數(shù)的方法依序設(shè)計如下功能shell腳本:判斷$1是否為hello,如果是,顯示:“Hello,howareyou?”;如果沒有任何參數(shù),提示用戶必須使用參數(shù);如果加入的參數(shù)不是hello,就提醒用戶僅能使用hello為參數(shù);多分支

if[條件];then

語句

elif[條件];then

語句

else

語句

fi2.if條件語句3.case語句if條件語句用于在兩個選項中選定一項,而case條件選擇為用戶提供了從多個選項中選擇一項的方法,其格式如下:

casestringin

exp-1)

若干個命令行1

;;

exp-2)

若干個命令行2

;;

……

*)

其他命令行

esac通常用“*”作為case命令的最后表達式以便使在前面找不到任何相應(yīng)的匹配項時執(zhí)行“其他命令行”的命令。shell通過計算字符串string的值,將其結(jié)果依次和表達式exp-1、exp-2等進行比較,直到找到一個匹配的表達式為止,如果找到了匹配項則執(zhí)行它下面的命令直到遇到一對分號(;;)為止。$變量名稱例3:利用位置參數(shù)的方法依序設(shè)計如下功能shell腳本:判斷$1是否為hello,如果是,顯示:“Hello,howareyou?”;如果沒有任何參數(shù),提示用戶必須使用參數(shù);如果加入的參數(shù)不是hello,就提醒用戶僅能使用hello為參數(shù);3.case語句一般來說,使用“case$變量in”這個語法中,“$變量”大致有兩種取得的方式:直接執(zhí)行式:利用位置參數(shù)交互式:通過read這個命令來讓用戶輸入變量的內(nèi)容3.case語句例:讓用戶輸入one,two,three,并將用戶的變量顯示到屏幕上,如果不是one,two,three時,告知用戶僅有這三種選擇。3.case語句3.case語句例:選擇P或p來打印文件,選擇D或d來刪除文件,其他則退出。4.select語句select表達式是bash的一種擴展應(yīng)用,常用于交互式場合。用戶可以從一組不同的值中進行選擇:動作包括:

(1)、自動用1,2,3,4列出菜單(沒有echo指令,自動顯示菜單)

(2)、自動read輸入選擇(沒有read指令,自動輸入)

(3)、賦值給變量(沒有賦值指令,自動輸入數(shù)字后,賦值字符串給變量)5.for循環(huán)(固定循環(huán))for循環(huán)對一個變量的可能的值都執(zhí)行一個命令序列。賦給變量的幾個數(shù)值既可以在程序內(nèi)以數(shù)值列表的形式提供,也可以在程序以外以位置參數(shù)的形式提供。for循環(huán)的一般格式為:

for

變量名[in數(shù)值列表]

do

若干個命令行

done變量名可以是用戶選擇的任何字符串,如果變量名是var,則在in之后給出的數(shù)值將順序替換循環(huán)命令列表中的$var。如果省略了in,則變量var的取值將是位置參數(shù)。對變量的每一個可能的賦值都將執(zhí)行do和done之間的命令列表。5.for循環(huán)for循環(huán)的另外一種寫法(用于數(shù)值方式的運算中):

for

((初始值;限制值;執(zhí)行步長))

do

程序段

done說明:初始值:i=1限制值:i<=100執(zhí)行步長:i=i+1(i++)5.for循環(huán)例1:例2:如果省略了in,則變量var的取值將是位置參數(shù),for_demo25.for循環(huán)例3:判斷/etc下r開頭的文件的目錄屬性(是目錄還是文件)例4:實現(xiàn)1加到1006.while和until循環(huán)(不定循環(huán))while和until命令都是用命令的返回狀態(tài)值來控制循環(huán)的。While循環(huán)的一般格式為:

while

若干個命令行1

do

若干個命令行2

done只要while的“若干個命令行1”中最后一個命令的返回狀態(tài)為真,while循環(huán)就繼續(xù)執(zhí)行do...done之間的“若干個命令行2”。6.while和until循環(huán)until命令是另一種循環(huán)結(jié)構(gòu),它和while命令相似,其格式如下:

until

若干個命令行1

do

若干個命令行2

doneuntil循環(huán)和while循環(huán)的區(qū)別在于:while循環(huán)在條件為真時繼續(xù)執(zhí)行循環(huán),而until則是在條件為假時繼續(xù)執(zhí)行循環(huán)。6.while和until循環(huán)#!/bin/bashx=1while[$x-le10]doecho$xx=$(($x+1))done#!/bin/bashx=1until[$x-gt10]doecho$xx=$(($x+1))done例:輸出1-10這十個數(shù)7.break和continue在Shell的for、while、until循環(huán)語句中,也可以使用如C語言的break和continue語句以跳離現(xiàn)有的循環(huán)。break語句用于中斷循環(huán)的執(zhí)行,將程序流程移至循環(huán)語句結(jié)束之后的下一個命令。而continue語句則忽略之后的命令,將程序流程轉(zhuǎn)移至循環(huán)開始的地方。break和continue語句都可以加上數(shù)字,以指示要跳出的循環(huán)數(shù)目。break和continue放在do和done之間才有效。7.break和continue例:觀察程序執(zhí)行結(jié)果。8.函數(shù)在shell腳本中可以定義并使用函數(shù)。其定義格式為:[function]函數(shù)名(){

命令表

}函數(shù)應(yīng)先定義,后使用。調(diào)用函數(shù)時,直接利用函數(shù)名,如showfile,不必帶圓括號函數(shù)中的最后一個命令執(zhí)行之后,就退出被調(diào)函數(shù)。也可利用return命令立即退出函數(shù),其語法格式是:

return[n]8.函數(shù)例如:#!/bin/sh#funTest#totestthefunctionDATE=`date`Hello(){echo“Hello,todayis$DATE”}echo“scriptstarting”Helloecho“scriptended”定義使用9.命令分組在shell中有兩種命令分組的方法:“()”和“{}”。用(command_list;)將一組命令括起來,則這些命令會由子shell來完成;當(dāng)用戶在執(zhí)行某個命令時不想讓命令運行時對狀態(tài)集合(如位置參數(shù)、環(huán)境變量、當(dāng)前工作目錄等)的改變影響到下面語句的執(zhí)行時,就應(yīng)該把這些命令放在圓括弧中,這樣就能保證所有的改變只對子進程產(chǎn)生影響,而父進程不受任何干擾。而{command_list;}則在當(dāng)前shell中執(zhí)行。“{}”用于將順序執(zhí)行的命令的輸出結(jié)果用于另一個命令的輸入。這兩者的主要區(qū)別在于其對shell變量的影響,子shell執(zhí)行的命令不會影響當(dāng)前shell中的變量。9.命令分組例如:(mytest)10.信號信號就是系統(tǒng)向腳本或命令發(fā)出的消息,告知它們某個事件的發(fā)生。有些信號可以被應(yīng)用程序或腳本捕獲,并依據(jù)該信號采取相應(yīng)的行動。另外一些信號不能被捕獲。例如,如果一個命令收到了信號9,就無法再捕捉其他信號。在編寫shell腳本時,只需關(guān)心信號1、2、3和15。當(dāng)腳本捕捉到一個信號后,它可能會采取下面三種操作之一:1)捕獲該信號,并采取相應(yīng)的行動—程序自定義的動作。2)不采取任何行動,由系統(tǒng)來進行處理。3)捕獲該信號,但忽略它。大多數(shù)的腳本都使用第2種處理方法。如果想要采取另外兩種處理方法,必須使用trap命令。10.信號trap對上面三種方式提供了三種基本形式:第一種形式的trap命令在shell接收到signallist清單中數(shù)值相同的信號時,將執(zhí)行引號中的命令串。

trap‘commands’signal-list trap“commands”signal-list

第二種形式為了恢復(fù)信號的默認(rèn)操作使用的trap命令:

trapsignal-list第三種形式的trap命令允許忽視信號:

trap‘’signal-list注:在64位系統(tǒng)上,執(zhí)行kill–l命令可以看到幾乎所有的信號閱讀程序,述說其功能

這些命令構(gòu)造在shell內(nèi)部,從而在shell進程內(nèi)執(zhí)行。常見內(nèi)置命令有: .,cd,echo,exit,excute,export,pwd,read,readonly,return[n],set,shift[n],test,bg,fg,kill等。1.echo命令格式:echoarg功能:在屏幕上顯示出由arg指定的字串。2.eval命令格式:evalargs功能:當(dāng)Shell程序執(zhí)行到eval語句時,Shell讀入?yún)?shù)args,并將它們組合成一個新的命令,然后執(zhí)行。5.3Bash的內(nèi)部命令3.exec命令格式:exec

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

變量名表功能:從標(biāo)準(zhǔn)輸入設(shè)備讀入一行,分解成若干字,賦值給Shell程序內(nèi)部定義的變量。7.shift語句功能:shift語句按如下方式重新命名所有的位置參數(shù)變量,即$2成為$1,$3成為$2…在程序中每使用一次shift語句,都使所有的位置參數(shù)依次向左移動一個位置,并使位置參數(shù)$#減1,直到減到0為止。8.wait功能:使Shell等待在后臺啟動的所有子進程結(jié)束。wait的返回值總是真。9.exit功能:退出Shell程序。在exit之后可有選擇地指定一個數(shù)位作為返回狀態(tài)。10.“.”(點)命令格式:.Shell程序文件名功能:使Shell讀入指定的Shell程序文件并依次執(zhí)行文件中的所有語句。1.Shell的運行方法:執(zhí)行shell腳本的方式基本上有下述三種。 1)輸入重定向。 bash<腳本名

2)以腳本名作為參數(shù)。其一般形式: bash腳本名 例2:執(zhí)行test2.sh。

[root@localhostroot]#bashtest2.sh/root/home/student 執(zhí)行test2.sh帶了兩個參數(shù)/root、/home/student,如果要帶參數(shù)執(zhí)行建議采用下面的方法設(shè)置文件可執(zhí)行。5.4Shell程序的運行與調(diào)試

3)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。

例3:設(shè)置腳本“test1.sh”設(shè)置為對所有用戶都有“執(zhí)行”權(quán)限并執(zhí)行。

[root@localhostroot]#chmoda+xtest1.sh 在提示符后輸入腳本名“test1.sh”就可直接執(zhí)行該文件。

[root@localhostroot]#test1.sh5.4

溫馨提示

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

評論

0/150

提交評論