




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第9章 Shell程序設計9.1Shell語言概述9.2Shell特殊字符9.3Shell變量9.4Shell表達式9.5Shell控制結(jié)構(gòu)9.6
Shell程序綜合舉例
9.1 Shell語言概述
Shell是命令語言的解釋器,它定義了Shell命令的語法和語義規(guī)范。只有遵守這種規(guī)范的命令行才能被Shell理解和執(zhí)行。Shell命令所使用的語言稱為Shell語言,它具備了編程語言的基本要素,如定義參數(shù)與變量、使用控制結(jié)構(gòu)等,因而可以實現(xiàn)各種復雜的處理邏輯。
9.1.1 Shell語言的特點
與其他編程語言相比,Shell語言具有如下特點:
(1)Shell是一種解釋性語言。
(2)Shell是基于字符串的語言。
(3)Shell是命令級語言。
需要說明的是,不同版本的Shell程序不完全兼容,差別可能是細微的,也可能是明顯的。本章介紹的是bash的編程,它的應用較廣泛,兼容性也很好。
9.1.2 Shell程序
Shell程序是由一系列Shell命令構(gòu)成的文本文件,也稱為Shell腳本(script)。簡單的Shell程序可以只是一個命令序列,高級Shell程序中還可以包含復雜的命令組合和控制結(jié)構(gòu)。
例9.1第1個Shell程序。
9.1.3 Shell程序的建立與執(zhí)行
Shell腳本是文本文件,因此可以用任何文本編輯器來編輯腳本。Shell腳本文件的名稱沒有限定的后綴名,通常不帶后綴名或帶“.sh”后綴名。
Shell腳本的執(zhí)行方式主要有3種:
(1) 將腳本作為可執(zhí)行文件直接執(zhí)行:
這種方式是將腳本作為Shell的外部命令來執(zhí)行的。
(2)派生一個Shell執(zhí)行腳本文件:
此命令將啟動一個bash子進程,專用于執(zhí)行參數(shù)指定的腳本。
(3)讓當前Shell執(zhí)行腳本文件:
source命令(也可以寫作“.”命令)是Shell的內(nèi)部命令,功能是讀取參數(shù)指定的文件,執(zhí)行其內(nèi)容。此命令就是讓當前Shell執(zhí)行腳本,而不是派生子Shell去執(zhí)行。
通常情況下,以上3種方式都可以使用,但需注意到可能存在的差異。如果腳本中有對Shell環(huán)境的修改操作,比如執(zhí)行cd命令改變當前目錄,則前2種執(zhí)行方式不會對當前Shell產(chǎn)生影響,而第3種方式會直接作用于當前Shell。
9.2 Shell特殊字符
Shell定義了一些特殊的字符,稱為元字符(meta-characters),它們對Shell有特殊的含義。Shell在讀入命令行后,要先對命令行進行掃描,找出元字符并進行相應的替換或處理。恰當?shù)剡\用元字符能使命令的功效充分發(fā)揮。
9.2.1 通配符
通配符用于描述命令行中的文件名參數(shù)。當Shell遇到帶有通配符的文件名模式時,它將當前目錄中的所有文件與該模式進行匹配,并用匹配的文件名替換命令行中的文件名模式。表9-1列出了常用的通配符。
例9.2通配符的匹配作用。
9.2.2 輸入/輸出重定向與管道符
輸入/輸出重定向和管道符的作用是改變命令的輸入/輸出環(huán)境。當Shell在命令行中遇到輸入/輸出重定向或管道符時,它將對命令的標準輸入/輸出文件作相應的更改,然后再執(zhí)行命令。表9-2列出了常用的輸入/輸出重定向與管道符。
1. 標準輸入/輸出重定向
“<”是標準輸入重定向符,它將標準輸入stdin重定向到一個文件?!?gt;”是標準輸出重定向符,它將標準輸出重定向到一個文件。為了區(qū)分是哪種輸出重定向,可以在符號前加一個文件描述符fd。stdout的fd是1,stderr的fd是2,所以“1>”表示標準輸出重定向,“2>”表示標準錯誤輸出重定向。未指定fd時,默認地表示是“1>”。
例9.3將標準輸入改為infile文件,標準輸出改為outfile文件,標準錯誤輸出改為errfile文件。
2. 合并重定向與歸并重定向
“&>”是標準輸出合并重定向符,它將標準輸出與標準錯誤輸出合在一起重定向到一個文件?!?gt;&”是標準輸出歸并重定向符,它將一種標準輸出歸并到另一種標準輸出流中。符號的前后各用一個fd來表示歸并的方式。“1>&2”或“>&2”表示將stdout歸并到stderr流中;“2>&1”表示將stderr歸并到stdout流中。
3. 附加重定向
“>>”是標準輸出附加重定向符,它將標準輸出或標準錯誤輸出用追加的方式重定向到一個文件?!?>>”或“>>”表示stdout附加重定向;“2>>”表示stderr附加重定向。
例9.7在.bash_profile文件的尾部添加一行。
4. here文檔
“<<”是一種特殊的標準輸入重定向機制,稱為“here文檔”(heredocument)。here文檔的表示格式是“<<結(jié)束標記字符串”,它的作用是指示Shell將本命令行后面的輸入行作為命令的標準輸入傳給命令,直到遇到結(jié)束標記字符串為止。
例9.8here文檔的使用。
5. 管道
“|”是管道符,它將前一命令的標準輸出作為后一命令的標準輸入?!皘
tee”是T型管道符,它將前一命令的標準輸出存入一個文件中,并傳遞給后一命令作為標準輸入。
9.2.3 命令執(zhí)行控制符
命令執(zhí)行控制符用于控制命令的執(zhí)行方式,指示Shell該如何執(zhí)行命令。表9-3列出了常用的命令執(zhí)行控制符。
1. 順序執(zhí)行
“;”是順序執(zhí)行符,它將兩個或多個命令組合在一個命令行中,指示Shell順序執(zhí)行這些命令。
例9.11轉(zhuǎn)到上一級目錄,顯示目錄的路徑名和目錄的文件列表。
2. 條件執(zhí)行
“&&”是邏輯與執(zhí)行符,它將兩個或多個命令組合在一個命令行中,指示Shell依次執(zhí)行這些命令直到某個命令失敗為止?!皘|”是邏輯或執(zhí)行符,它將兩個或多個命令組合在一個命令行中,指示Shell依次執(zhí)行這些命令直到某個命令成功為止。
3. 后臺執(zhí)行
“&”是后臺執(zhí)行符,它指示Shell將該命令放在后臺執(zhí)行。后臺執(zhí)行的命令不占用終端與用戶交互,因此Shell在執(zhí)行后臺命令后可以立即返回提示符。
例9.14在后臺運行yes命令,丟棄輸出。
9.2.4 命令組合符
命令組合符的作用是指示Shell將多個命令組合在一起執(zhí)行。組合的目的是對這些命令統(tǒng)一進行某種操作,如管道、后臺運行、輸入/輸出重定向等。
9.2.5 命令替換符
當一個字符串被括在反撇號中,如`字符串`,則該字符串將先被Shell作為命令解釋執(zhí)行,然后用命令執(zhí)行后的輸出結(jié)果替換`字符串`。
例9.19命令替換符的用法。
9.2.6 其他元字符
表9-4列出了其他幾個常用的元字符。
例9.20使用注釋符對命令進行說明。
9.2.7 元字符的引用
當需要引用元字符的原始含義,而不是它的特殊含義時,就必須用引用符對它進行轉(zhuǎn)義,消除其特殊含義。當Shell遇到引用符時,它將該引用符作用范圍內(nèi)的字符看作是普通字符。常用的引用符有3種,即轉(zhuǎn)義符、單引號和雙引號。表9-5列出了它們的含義。
例9.21在命令行中引用元字符。
9.3 Shell變量9.3.1 變量的定義與使用1. 定義變量定義變量時要注意變量的命名規(guī)則。變量的名字必須以字母或下畫線開頭,可以包括字母、數(shù)字和下畫線。例如:user1、birth_day、_time都是合法的變量名,而2user、birth-day則不是。在Shell中,對變量的定義與賦值是同時完成的。通常可采用兩種方式,即用賦值命令直接賦值,或用read命令從終端讀入賦值。格式如下:
2. 引用變量
引用變量即是求出變量的值(字符串),替換在發(fā)生引用的位置。引用變量的方法是在變量名前加引用字符“$”,格式是:
例9.24在命令中引用變量。
例9.25引用變量的方法。
3. 設置只讀變量
為了防止變量的值被修改,可以用readonly命令定義只讀變量,格式是:
readonly變量名[=字符串]
例9.26設置只讀變量。
4. 清除變量
用unset命令清除變量。清除后的變量變?yōu)槲炊x變量,引用其值將得到空字符串。注意,只讀變量是不能被清除的。unset命令的格式是:
unset變量名[變量名…]
例9.27清除變量。
9.3.2 變量的作用域
變量的作用域是指變量可以被引用的范圍。根據(jù)變量的作用域來劃分,Shell變量可以分為兩類,即本地變量和導出變量。
1. 本地變量
在一個Shell中定義的變量默認只在此Shell中才有意義,也就是說它們的作用是局部的,這種變量稱為本地變量。
例9.28本地變量的作用域。
2. 導出變量
當Shell執(zhí)行一個命令或腳本時,它通常會派生出一個子進程來執(zhí)行命令。如果希望Shell的變量在其子進程中也可用,可以通過導出操作將變量傳遞給子進程。導出的變量稱為導出變量,它與本地變量的區(qū)別在于:導出變量可以被任何子進程引用,而本地變量僅在定義它的進程環(huán)境下才能使用。導出變量的命令是export,格式是:
export變量名[=字符串]
例9.29導出變量與本地變量的使用。
9.3.3 變量的分類
1. 用戶變量
用戶變量是用戶為實現(xiàn)某種應用目的而定義的變量。
2. 環(huán)境變量
環(huán)境變量是由系統(tǒng)預定義的一組變量,用于為Shell提供有關運行環(huán)境的信息。
3. 特殊變量
特殊變量是由Shell自定義的一組變量,用于記錄有關Shell當前運行狀態(tài)的一些信息,如運行參數(shù)、進程號等。
9.3.4 環(huán)境變量
1. 環(huán)境與環(huán)境變量
Shell執(zhí)行時需要了解一些有關系統(tǒng)和用戶的基本信息以及一些默認設置信息。這些信息以變量的形式提供,稱為環(huán)境變量。環(huán)境變量的全體就稱為Shell的執(zhí)行環(huán)境。
系統(tǒng)環(huán)境變量是系統(tǒng)預定義的,用戶也可以根據(jù)需要添加自己的環(huán)境變量。系統(tǒng)環(huán)境變量的名稱是系統(tǒng)預留的,全部為大寫。表9-6列出了常用的系統(tǒng)環(huán)境變量。
2. 環(huán)境變量的定義與使用
環(huán)境變量定義在Shell的配置文件中,Shell啟動時會執(zhí)行這些配置文件,建立起運行環(huán)境。啟動完成后,這些環(huán)境變量都已經(jīng)被賦值,在隨后的命令中可以直接使用。
例9.30在Shell中引用和修改環(huán)境變量。
3. Shell命令的執(zhí)行環(huán)境
Shell的所有導出的變量都可以被Shell的子進程繼承使用,這些導出變量的全體構(gòu)成了該Shell的命令執(zhí)行環(huán)境。用env命令或export-p命令即可顯示執(zhí)行環(huán)境中的所有變量。
命令程序訪問執(zhí)行環(huán)境的方法是:腳本程序可以直接引用或修改其執(zhí)行環(huán)境中的變量;C程序可以用setenv()和getenv()函數(shù)訪問其執(zhí)行環(huán)境中的變量。
例9.31在腳本中訪問執(zhí)行環(huán)境。
9.3.5 特殊變量
Shell中有一組預定義的特殊的變量,其功能是記錄Shell當前的運行狀態(tài)的一些信息,如運行參數(shù)、進程標識和命令退出狀態(tài)等。特殊變量的變量名和值由Shell自動設置。這些變量都是只讀變量,因此在程序中可以引用這些變量,但不能直接對它們賦值。表9-7列出了幾個常用的特殊變量。
1. 參數(shù)變量
向Shell腳本傳遞數(shù)據(jù)的途徑有兩種:一種是通過導出變量進行傳遞,另一種就是用命令行參數(shù)來傳遞。
參數(shù)變量主要有以下幾個:
(1)$#:記錄命令行參數(shù)的個數(shù)。
(2)$*:記錄命令行的整個參數(shù)。
(3)$@:記錄命令行的各個參數(shù)。
(4)$i:稱為位置變量,是按位置記錄命令參數(shù)的一組變量,分別為$0,$1,$2,…,$9,${10},…。
例如,某命令的名稱為myprog,執(zhí)行時的命令行是myprog-s"Howareyou!"joejean。當該命令被執(zhí)行時,Shell隱含地為它建立起一系列參數(shù)變量,各參數(shù)變量的內(nèi)容如下:
例9.32在程序中引用參數(shù)變量。
2. 設置參數(shù)變量
參數(shù)變量是只讀的,因此用戶不能直接對參數(shù)變量重新賦值,但卻可以通過Shell提供的命令來設置這些變量。
1)用set命令設置位置變量
用set命令可以對位置變量及其他參數(shù)變量強制賦值,格式是:
set字符串1字符串2…
例9.33設置位置變量。
2)用shift命令移動位置變量
shift命令的功能是將位置變量與命令行參數(shù)的對應關系右移指定的位數(shù),格式是:
shift[位移量]
未指定位移量參數(shù)時右移1位。
注意:shift只移動$1及其后面的位置變量的值,$0變量的值保持不變。移位的同時,$#變量的值將減去相應的數(shù),$@、$*等也相應地被重新賦值。
例9.34用shift命令移動位置變量的值。
3. 其他特殊變量
其他常用的特殊變量是記錄命令退出狀態(tài)和進程PID的變量。
1)退出狀態(tài)變量
在Linux系統(tǒng)中,每個命令在執(zhí)行結(jié)束退出時都要返回給系統(tǒng)一個狀態(tài)碼。在C程序中是調(diào)用exit(status)函數(shù)退出,在Shell腳本中則是用exit
status命令退出。其中的status就是返回給系統(tǒng)的狀態(tài)碼。通常的約定是,程序成功結(jié)束時返回0狀態(tài)值;程序出錯時返回非0的狀態(tài)值(比如1、2、-1等)。
例9.35從$?變量獲得命令的退出狀態(tài)。
2)命令的進程號
$$變量記錄了本命令進程的進程號PID。當一個命令以子進程的方式開始運行時,Shell將它的進程號PID存入$$變量中。
例9.36從$$變量獲得命令的進程號。
9.4 Shell表達式
Shell語言支持表達式計算。Shell表達式主要有兩種形式:一種是用于數(shù)值計算的算術表達式,其結(jié)果是數(shù)值;另一種是用于進行條件測試或判斷的邏輯表達式,其結(jié)果是真假值。
9.4.1 數(shù)字運算表達式
與高級語言中的變量不同,Shell變量只有字符類型,所以只能存放整數(shù)數(shù)字字符串,如“127”等。Shell本身也沒有數(shù)字運算的能力,必須借助某些命令來進行算術運算。expr就是用來進行數(shù)字表達式計算的命令。
例9.37expr命令用法示例。
9.4.2 邏輯測試表達式
除了數(shù)字表達式的計算,Shell還支持邏輯表達式的測試。邏輯表達式由運算符和運算對象組成。執(zhí)行邏輯表達式測試的命令是test。
表9-8列出了test命令的常用邏輯表達式。
1. 字符串測試表達式
例9.38字符串測試。
例9.39含有空格的字符串及空字符串的測試。
2. 數(shù)字測試表達式
例9.40數(shù)字比較測試。
3. 文件測試表達式
例9.41文件測試。
例9.42目錄測試。
4. 邏輯測試表達式
例9.43帶有邏輯運算符的表達式測試。
9.5 Shell控制結(jié)構(gòu)
Shell提供了幾個專門的內(nèi)部命令來構(gòu)造控制結(jié)構(gòu),用它們可以構(gòu)造出任意的分支與循環(huán)。這些命令可以分為以下幾類: 分支結(jié)構(gòu):if、case; 循環(huán)結(jié)構(gòu):while、until、for; 循環(huán)控制:break、continue; 結(jié)束:return、exit。
9.5.1 條件與條件命令
控制結(jié)構(gòu)需要根據(jù)某個條件作出控制轉(zhuǎn)向的決策。在Shell語言中,條件是某命令的退出狀態(tài)。當命令執(zhí)行成功時,它返回一個0狀態(tài)(即$?為0),此時條件為真;若命令失敗,返回一個非0狀態(tài)(即$?不為0),則此時條件為假。
用于進行條件判斷的命令就稱為條件命令。
9.5.2 分支控制命令
分支控制命令用于控制程序在不同的條件取值下執(zhí)行不同的流程。用于分支控制的命令有if和case,if命令用于兩路分支控制,case命令用于多路分支控制。
1. if命令
2. case命令
用case命令進行多路條件測試,結(jié)構(gòu)更清晰。case命令的格式是:
例9.46根據(jù)參數(shù)個數(shù)進行相應處理。
例9.47按時間顯示問候語。
9.5.3 循環(huán)控制命令
循環(huán)控制命令用于重復執(zhí)行某個處理過程。Shell提供了3種循環(huán)結(jié)構(gòu)的循環(huán)控制命令,即for、while和until。這些命令既可以用在腳本中,也可以在Shell下直接執(zhí)行。
1. for命令
例9.48循環(huán)處理一組文件。
例9.49循環(huán)處理參數(shù)列表。
2. while命令
while命令的作用是進行有條件的循環(huán)控制,當條件為真時執(zhí)行循環(huán)體命令列表,直到條件為假時結(jié)束。while命令常用于循環(huán)次數(shù)或循環(huán)處理的對象不夠明確的循環(huán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 20972.3-2025石油天然氣工業(yè)油氣開采中用于含硫化氫環(huán)境的材料第3部分:抗開裂耐蝕合金和其他合金
- 醫(yī)院門禁施工方案
- 河邊堤壩加固施工方案
- 快拼箱施工方案
- 富錦打井施工方案
- 我的中國夢作文100字篇
- 二零二五年度燃氣泄漏報警器安裝合同
- 二零二五年度情侶旅行計劃與費用分攤合同
- 二零二五年度餐飲單位市場拓展合作合同
- 二零二五年度房屋出租中介服務合同(含租賃合同解除條件)
- 管理系統(tǒng)中計算機應用詳細課件
- 《多維度兒童智力診斷量表》MIDSC的編制
- 慢阻肺從急性加重期到穩(wěn)定期的全程管理
- 2023年上海市普陀區(qū)高考歷史二模試卷及答案解析
- 瑞達峰環(huán)境友好型高附加值關鍵醫(yī)藥中間體、特色原料藥及 GMP 成品藥(仿制藥與創(chuàng)新藥)規(guī)模化生產(chǎn)項目(一期)環(huán)評報告書
- 嚴重創(chuàng)傷的急救處理
- GB/T 19870-2018工業(yè)檢測型紅外熱像儀
- GB/T 1228-2006鋼結(jié)構(gòu)用高強度大六角頭螺栓
- 國際商法 吳建斌課件 思考題答案
- 高等儀器分析第1章-緒論課件
- 怎樣聽課、評課課件
評論
0/150
提交評論