算術運算
bash中執(zhí)行整數(shù)算術運算的命令是let,其語法格式為: let arg …
其中,arg是單獨的算術表達式。這里的算術表達式使用C語言中表達式的語法、優(yōu)先級和結合性。除++、--和逗號(,)之外,所有整型運算符都得到支 持。此外,還提供了方冪運算符“**”。命名的參數(shù)可以在算術表達式中直接利用名稱訪問,不要前面帶有“$”符號。當訪問命名參數(shù)時,就作為算術表達式計 算它的值。算術表達式按長整數(shù)進行求值,并且不檢查溢出。當然,用0作除數(shù)就產(chǎn)生錯誤。 let 命令的替代表示形式是: ((算術表達式))
例如,let ″j=i*6+2″等價于((j=i*6+2))。 如果表達式的值是非0,那么返回的狀態(tài)值是0;否則,返回的狀態(tài)值是1。 當表達式中有Shell的特殊字符時,必須用雙引號將其括起來。例如,let ″val=a|b″。如果不括起來,Shell會把命令行l(wèi)et val=a|b中的“|”看成管道符,將其左右兩邊看成不同的命令,因而無法正確執(zhí)行。 控制結構 Shell具有一般高級程序設計語言所具有的控制結構和其它的復雜功能,如if語句、 case語句、循環(huán)結構、函數(shù)等。其實在Shell中,這些控制結構也稱作“命令”。為了程序設計的習慣,才把它們稱作語句。 1.if語句 if語句用于條件控制結構中,其一般格式為: if 測試條件 其中,if、then、else和fi是關鍵字。例如:if test -f "$1" 應該注意,if語句中else部分可以缺省。另外,if 語句的else部分還可以是else—if結構,此時可以用關鍵字“elif”代替“else if”。
通常,if的測試部分是利用test命令實現(xiàn)的。其實,條件測試可以利用一般命令執(zhí)行成功與否來作判斷。如果命令正常結束,則表示執(zhí)行成功,其返回值為0,條件測試為真;如果命令執(zhí)行不成功,其返回值不等于0,條件測試就為假。所以if的語句的更一般形式是: if 命令表1
2.條件測試 條件測試有三種常用形式:一種是用test命令,如上所示。另一種是用一對方括號將測試條件括起來。這兩種形式是完全等價的。例如,測試位置參數(shù)$1是 否是已存在的普通文件,可寫為test -f "$1"。也可寫成[ -f "$1" ]。利用一對方括號表示條件測試時,在左方括號“[”之后、右方括號“]”之前各應有一個空格。 第三種形式是: [[條件表達式]]
test命令可以和多種系統(tǒng)運算符一起使用。這些運算符可以分為四類:文件測試運算符(文件的屬性及權限等)、字符串測試運算符(兩個串是否相同及是否為空)、數(shù)值測試運算符(大小關系)和邏輯運算符(邏輯與、或、非)。 3.case語句 case語句允許進行多重條件選擇。其一般語法形式是: case 字符串 in 其執(zhí)行過程是用“字符串”的值依次與各模式字符串進行比較,如果發(fā)現(xiàn)同某一個匹配,那么就執(zhí)行該模式字符串之后的各個命令,直至遇到兩個分號為止。如果沒有任何模式字符串與該字符串的值相符合,則不執(zhí)行任何命令。
在使用case語句時應注意: (1)每個模式字符串后面可有一條或多條命令,其最后一條命令必須以兩個分號(即;;)結束。 ?。?)模式字符串中可以使用通配符。 ?。?) 如果一個模式字符串中包含多個模式,那么各模式之間應以豎線(|)隔開,表示各模式是“或”的關系,即只要給定字符串與其中一個模式相配,就會執(zhí)行其后的命令表。 ?。?)各模式字符串應是惟一的,不應重復出現(xiàn)。并且要合理安排它們的出現(xiàn)順序。例如,不應將“*”作為頭一個模式字符串,因為“*”可以與任何字符串匹配,它若第一個出現(xiàn),就不會再檢查其它模式了。 ?。?)case語句以關鍵字case開頭,以關鍵字esac(是case倒過來寫!)結束。 (6)case的退出(返回)值是整個結構中最后執(zhí)行的那個命令的退出值。若沒有執(zhí)行任何命令,則退出值為零。 4. while語句 Shell中有三種用于循環(huán)的語句,它們是while語句、for語句和until語句。 while語句的一般形式是: while 測試條件
其執(zhí)行過程是,先進行條件測試,如果結果為真,則進入循環(huán)體(do—done之間部分), 執(zhí)行其中命令;然后再做條件測試……直至測試條件為假時才終止while語句的執(zhí)行。例如: while [ $1 ] 這段程序對各個給定的位置參數(shù),首先判斷其是否是普通文件,若是,則顯示其內容;否則,顯示它不是文件名的信息。每次循環(huán)處理一個位置參數(shù)$1,利用shift命令可把后續(xù)位置參數(shù)左移。
測試條件部分除使用test命令或等價的方括號外,還可以是一組命令。根據(jù)其最后一個命令的退出值決定是否進入循環(huán)體執(zhí)行。 5.until語句 until語句的一般形式是: until 測試條件
它與while語句很相似,只是測試條件不同:當測試條件為假時,才進入循環(huán)體,直至測試條件為真時終止循環(huán)。 6.for語句 for語句是最常用的建立循環(huán)結構的語句。其使用格式主要有三種,取決于循環(huán)變量的取值方式。格式一: for 變量 in 值表
例如: for day in Monday Wednesday Friday Sunday
其執(zhí)行過程是,變量day依次取值表中各字符串,即第一次將“Monday”賦給day,然后進入循環(huán)體,執(zhí)行其中的命令,顯示出Monday。第二次 將“Wednesday”賦給day,然后執(zhí)行循環(huán)體中命令,顯示出Wednesday。依次處理,當day把值表中各字符串都取過一次之后,下面day 的值就變?yōu)榭沾?,從而結束for循環(huán)。因此,值表中字符串的個數(shù)就決定了for循環(huán)執(zhí)行的次數(shù)。在格式上,值表中各字符串之間以空格隔開。 格式二: for 變量 in 文件正則表達式
其執(zhí)行過程是,變量的值依次取當前目錄下(或給定目錄下)與正則表達式相匹配的文件名,每取值一次,就進入循環(huán)體執(zhí)行命令表,直至所有匹配的文件名取完為止,退出for循環(huán)。 格式三: 這兩種形式是等價的。其執(zhí)行過程是,變量i 依次取位置參數(shù)的值,然后執(zhí)行循環(huán)體中的命令表,直至所有位置參數(shù)取完為止。 7.break命令和continue命令 break命令可以使我們從循環(huán)體中退出來。其語法格式是: break [ n ]
其中,n表示要跳出幾層循環(huán)。默認值是1,表示只跳出一層循環(huán)。 continue命令跳過循環(huán)體中在它之后的語句,回到本層循環(huán)的開頭,進行下一次循環(huán)。其語法格式是: continue [ n ]
其中,n表示從包含continue語句的最內層循環(huán)體向外跳到第幾層循環(huán)。默認值為1。循環(huán)層數(shù)是由內向外編號。 函數(shù) 在Shell腳本中可以定義并使用函數(shù)。其定義格式為: [function]函數(shù)名( )
其中,關鍵字function可以缺省。 函數(shù)應先定義,后使用。調用函數(shù)時,直接利用函數(shù)名,如showfile,不必帶圓括號,就像一般命令那樣使用。Shell腳本與函數(shù)間的參數(shù)傳遞可利 用位置參數(shù)和變量直接傳遞。變量的值可以由Shell腳本傳遞給被調用的函數(shù),而函數(shù)中所用的位置參數(shù)$1、$2,等對應于函數(shù)調用語句中的實參,這一點 是與普通命令不同的。下面是使用函數(shù)的示例: #func is a function name
Shell中的函數(shù)把若干命令集合在一起,通過一個函數(shù)名加以調用。如果需要,還可被多次調用。執(zhí)行函數(shù)并不創(chuàng)建新的進程,是通過Shell進程執(zhí)行。 通常,函數(shù)中的最后一個命令執(zhí)行之后,就退出被調函數(shù)。也可利用return命令立即退出函數(shù),其語法格式是: return [ n ]
其中,n值是退出函數(shù)時的退出值(退出狀態(tài)),即$?的值。當n值缺省時,則退出值是最后一個命令執(zhí)行后的退回值。 本講介紹了有關Shell編程的知識和示例,從中可以體會到bash的特點和長處。很顯然,對于系統(tǒng)管理員來說,利用bash編寫腳本解決問題,可以大大減輕工作強度,有效提高編程效率。建議讀者多上機練習。 |
|