版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章初識(shí)ShellShell如何連接用戶和內(nèi)核Shell連接其他程序Shell同樣支持編程Shell是一種腳本語(yǔ)言Shell的各種版本Shell是運(yùn)維工程師必備技能Shell變量的定義Shell變量的類型Shell變量的賦值Shell變量的運(yùn)算Shell變量的刪除、替換和替代Shell變量的自增Shell變量中的特殊符號(hào)Shell如何連接用戶和內(nèi)核Shell連接其他程序1.21.1Shell同樣支持編程1.3Shell是一種腳本語(yǔ)言1.4Shell的各種版本1.5?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell是運(yùn)維工程師必備技能1.6Shell變量的定義1.7Shell變量的類型Shell變量的賦值1.91.8Shell變量的運(yùn)算1.10?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell變量的刪除、替換和替代1.11Shell變量的自增1.12?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell變量中的特殊符號(hào)1.13學(xué)習(xí)目標(biāo)了解掌握掌握掌握了解什么是Shell1掌握Shell變量的刪除和替換42掌握Shell變量的用法和賦值3掌握Shell變量的整數(shù)和小數(shù)現(xiàn)在人們使用的操作系統(tǒng)(Windows、Android、iOS等)都帶有圖形界面,簡(jiǎn)單直觀,容易上手。然而早期的計(jì)算機(jī)并沒有圖形界面,人們只能使用煩瑣的命令來(lái)控制計(jì)算機(jī)。其實(shí),真正能夠控制計(jì)算機(jī)硬件(CPU、內(nèi)存、顯示器)的只有操作系統(tǒng)內(nèi)核(Kernel),圖形界面和命令行都是架設(shè)在用戶和內(nèi)核之間的橋梁,是為了方便用戶控制計(jì)算機(jī)而存在的。由于安全等原因,用戶不能直接接觸內(nèi)核,因此需要在用戶和內(nèi)核之間增加“命令解釋器”,這既能簡(jiǎn)化用戶的操作,又能保障內(nèi)核的安全。在Linux下,這個(gè)命令解釋器叫作“Shell”,它能讓用戶更加高效、安全、低成本地使用Linux內(nèi)核。變量是Shell程序運(yùn)行時(shí)使用的最小數(shù)據(jù)單元,也是Shell程序不可缺少的組成部分。本章主要講述Shell變量的具體用法,使讀者對(duì)Shell變量有更多的認(rèn)識(shí)。1.1Shell如何連接用戶和內(nèi)核Shell能夠接收用戶輸入的命令,并對(duì)命令進(jìn)行處理,處理完畢后再將結(jié)果反饋給用戶,如輸出到顯示器、寫入文件等。這就是大部分讀者對(duì)Shell的認(rèn)知。其實(shí),Shell程序本身的功能是很弱的,文件操作、輸入輸出、進(jìn)程管理等都得依賴內(nèi)核。用戶運(yùn)行一個(gè)命令,大部分情況下Shell都會(huì)去調(diào)用內(nèi)核暴露出來(lái)的接口,這就是在使用內(nèi)核,只是這個(gè)過(guò)程被Shell隱藏了起來(lái),在背后默默進(jìn)行,用戶看不到而已。接口其實(shí)就是一個(gè)一個(gè)的函數(shù),使用內(nèi)核就是調(diào)用這些函數(shù),除了函數(shù)沒有別的途徑使用內(nèi)核。1.1Shell如何連接用戶和內(nèi)核比如,用戶在Shell中輸入catlog.txt命令就可以查看log.txt文件中的內(nèi)容。log.txt放在磁盤的哪個(gè)位置?分成了幾個(gè)數(shù)據(jù)塊?如何操作探頭讀取它?這些底層細(xì)節(jié)Shell統(tǒng)統(tǒng)不知道,它只能去調(diào)用內(nèi)核提供的open()和read()函數(shù),告訴內(nèi)核讀取log.txt文件;然后內(nèi)核按照Shell的指令去讀取文件,并將讀取到的文件內(nèi)容交給Shell;最后由Shell把文件內(nèi)容呈現(xiàn)給用戶(呈現(xiàn)到顯示器上還得依賴內(nèi)核)。1.2Shell連接其他程序在Shell中輸入的命令,有一部分是Shell本身自帶的,這叫作內(nèi)置命令;有一部分是其他應(yīng)用程序(一個(gè)程序就是一個(gè)命令),這叫作外部命令。Shell本身支持的命令并不多,功能也有限,但是Shell可以調(diào)用其他程序,每個(gè)程序就是一個(gè)命令,這使得Shell命令的數(shù)量可以無(wú)限擴(kuò)展,其結(jié)果就是Shell的功能非常強(qiáng)大,完全能夠勝任Linux的日常管理工作,包括文本或字符串檢索、文件的查找或創(chuàng)建、大規(guī)模軟件的自動(dòng)部署、更改系統(tǒng)設(shè)置、監(jiān)控服務(wù)器性能、發(fā)送報(bào)警郵件、抓取網(wǎng)頁(yè)內(nèi)容、壓縮文件等。更令人驚訝的是,Shell還可以讓多個(gè)外部程序發(fā)生連接,在它們之間很方便地傳遞數(shù)據(jù),也就是把一個(gè)程序的輸出結(jié)果傳遞給另一個(gè)程序作為輸入信息。1.2Shell連接其他程序Shell連接程序的示意圖如圖所示。注意“用戶”和“其他應(yīng)用程序”是通過(guò)虛線連接的,因?yàn)橛脩魡?dòng)Linux后直接面對(duì)的是Shell,通過(guò)Shell才能運(yùn)行其他應(yīng)用程序。1.3Shell同樣支持編程Shell并不是簡(jiǎn)單的命令堆砌,用戶還可以在Shell中編程使用C++、C#、Java、Python等常見的編程語(yǔ)言并沒有什么兩樣。Shell雖然沒有C++、Java、Python等強(qiáng)大,但也支持以下基本的編程元素。(1)if...else選擇結(jié)構(gòu),case...in開關(guān)語(yǔ)句,for、while、until循環(huán)。(2)變量、數(shù)組、字符串、注釋、加減乘除、邏輯運(yùn)算等概念。(3)函數(shù),包括用戶自定義的函數(shù)和內(nèi)置函數(shù)(如printf()、export()、eval()等)。從這個(gè)角度講,Shell也是一種編程語(yǔ)言,它的編譯器(解釋器)是Shell這個(gè)程序。因此,平時(shí)所說(shuō)的Shell有時(shí)候是指連接用戶和內(nèi)核的這個(gè)程序,有時(shí)候又是指Shell編程。1.3Shell同樣支持編程Shell主要用來(lái)開發(fā)一些實(shí)用的、自動(dòng)化的小工具,而不是用來(lái)開發(fā)具有復(fù)雜業(yè)務(wù)邏輯的中大型軟件。例如,檢測(cè)計(jì)算機(jī)的硬件參數(shù)、搭建Web運(yùn)行環(huán)境、日志分析等,Shell都非常合適。使用Shell的熟練程度反映了用戶對(duì)Linux的掌握程度,運(yùn)維工程師、網(wǎng)絡(luò)管理員、程序員都應(yīng)該學(xué)習(xí)Shell。對(duì)Linux運(yùn)維工程師來(lái)說(shuō),Shell更是必須掌握的技能。Shell使自動(dòng)化管理服務(wù)器集群成為可能,否則用戶只能一個(gè)一個(gè)地登錄所有的服務(wù)器,對(duì)每一臺(tái)服務(wù)器進(jìn)行相同的設(shè)置,而這些服務(wù)器可能有成百上千之多,用戶會(huì)在重復(fù)性的工作上浪費(fèi)大量的時(shí)間。1.4Shell是一種腳本語(yǔ)言幾乎所有的編程語(yǔ)言,如C/C++、Pascal、Go、匯編語(yǔ)言等,都必須在程序運(yùn)行之前將所有代碼翻譯成二進(jìn)制形式,也就是生成可執(zhí)行文件。用戶拿到的是生成的可執(zhí)行文件,看不到源碼。這個(gè)過(guò)程叫作編譯,這樣的編程語(yǔ)言叫作編譯型語(yǔ)言,完成編譯過(guò)程的軟件叫作編譯器。而有的編程語(yǔ)言,如Shell、JavaScript、Python、PHP等,需要一邊執(zhí)行一邊翻譯,不會(huì)生成可執(zhí)行文件,用戶必須拿到源碼才能運(yùn)行程序。程序開始運(yùn)行后會(huì)即時(shí)翻譯,翻譯完一部分執(zhí)行一部分,不用等到所有代碼都翻譯完。這個(gè)過(guò)程叫作解釋,這樣的編程語(yǔ)言叫作解釋型語(yǔ)言或者腳本語(yǔ)言(Script),完成解釋過(guò)程的軟件叫作解釋器。1.4Shell是一種腳本語(yǔ)言編譯型語(yǔ)言的優(yōu)點(diǎn)是執(zhí)行速度快、對(duì)硬件要求低、保密性好,適合開發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫(kù)等。腳本語(yǔ)言的優(yōu)點(diǎn)是使用靈活、部署容易、跨平臺(tái)性好,非常適合Web開發(fā)以及小工具的制作。Shell就是一種腳本語(yǔ)言,用戶編寫完源碼后不用編譯,直接運(yùn)行源碼即可。1.5Shell的各種版本1.5.1BourneShell返回目錄1.5.2CShell1.5.3BashShell1.5.4查看Shell版本1.5Shell的各種版本其實(shí)Shell的版本有很多種,其中常用的幾種是BourneShell、CShell和BashShell。1.5Shell的各種版本1.5.1BourneShellBourneShell簡(jiǎn)稱sh,由貝爾實(shí)驗(yàn)室開發(fā),是UNIX最初使用的Shell,并且在每種UNIX上都可以使用。BourneShell在編程方面相當(dāng)優(yōu)秀,可以滿足用戶大部分的Shell編程要求,也是平時(shí)工作中比較常用的Shell版本。缺點(diǎn)是在處理與用戶的交互方面做得不如其他版本的Shell。1.5Shell的各種版本1.5.2CShellCShell簡(jiǎn)稱csh,比BourneShell更加適用于編程。CShell的語(yǔ)法與C語(yǔ)言的語(yǔ)法很相似。Linux操作系統(tǒng)還為喜歡使用CShell的人提供了tcsh。tcsh是CShell的一個(gè)擴(kuò)展版本,包含命令行編輯、可編程單詞補(bǔ)全、拼寫校正、歷史命令替換、作業(yè)控制和類似C語(yǔ)言的語(yǔ)法。它不僅兼容BashShell提示符,還提供比BashShell更多的提示符參數(shù)。1.5Shell的各種版本1.5.3BashShellBashShell是Linux的默認(rèn)Shell,本書也基于BashShell編寫。BourneAgainShell是Linux操作系統(tǒng)所使用的Shell,它是BourneShell的擴(kuò)展,簡(jiǎn)稱bash。bash與BourneShell完全向下兼容,也就是說(shuō)bash可以兼容相同版本的BourneShell。bash在BourneShell的基礎(chǔ)上增加、增強(qiáng)了很多特性,所以它比BourneShell能力更強(qiáng)。bash放在Linux系統(tǒng)的/bin/bash文件夾中,它有許多特色,提供如命令補(bǔ)全、命令編輯和命令歷史表等功能,而且還具備CShell的很多優(yōu)點(diǎn),有靈活和強(qiáng)大的編程接口,同時(shí)又有很友好的用戶界面。bash是所有Shell中較為完美的版本,也是較為常用的Shell。1.5Shell的各種版本1.5.4查看Shell版本Shell是一個(gè)程序,一般都放在/bin或者/usr/bin目錄下。當(dāng)前Linux系統(tǒng)可用的Shell都記錄在/etc/shells文件中。/etc/shells是一個(gè)純文本文件,用戶可以在圖形界面下打開它,也可以使用cat命令查看它。通過(guò)cat命令來(lái)查看當(dāng)前Linux系統(tǒng)的可用Shell:1.5Shell的各種版本1.5.4查看Shell版本在現(xiàn)代Linux中,sh已經(jīng)被bash代替,/bin/sh往往是指向/bin/bash的符號(hào)鏈接。如果用戶希望查看當(dāng)前Linux的默認(rèn)Shell,那么可以輸出SHELL環(huán)境變量:輸出結(jié)果表明默認(rèn)的Shell是bash。其中echo是一個(gè)Shell命令,用來(lái)輸出變量的值,下一節(jié)將詳細(xì)介紹它的用法。SHELL是Linux系統(tǒng)中的環(huán)境變量,它指明了當(dāng)前使用的Shell程序的位置,也就是使用的是哪個(gè)Shell。1.6Shell是運(yùn)維工程師必備技能Linux
運(yùn)維工程師負(fù)責(zé)Linux服務(wù)器的運(yùn)行和維護(hù)。隨著互聯(lián)網(wǎng)的爆發(fā),Linux運(yùn)維也迎來(lái)了春天,出現(xiàn)了大量的職位需求,催生了一批Linux運(yùn)維培訓(xùn)班。如今的IT服務(wù)器領(lǐng)域,Linux、UNIX、Windows三分天下。Linux系統(tǒng)可謂后起之秀,特別是“互聯(lián)網(wǎng)熱”以來(lái),Linux在服務(wù)器端的市場(chǎng)份額不斷擴(kuò)大,每年增長(zhǎng)勢(shì)頭迅猛,超過(guò)了Windows和UNIX的總和。在未來(lái)的服務(wù)器領(lǐng)域,Linux領(lǐng)跑是大勢(shì)所趨。Linux在服務(wù)器上的應(yīng)用非常廣泛,可以用來(lái)搭建Web服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、負(fù)載均衡服務(wù)器(CDN)、郵件服務(wù)器、DNS服務(wù)器、反向代理服務(wù)器、VPN服務(wù)器、路由器等。用Linux作為服務(wù)器系統(tǒng)不但非常高效和穩(wěn)定,還不用擔(dān)心版權(quán)問(wèn)題,不用付費(fèi)。1.6Shell是運(yùn)維工程師必備技能大規(guī)模應(yīng)用的Linux服務(wù)器需要一批專業(yè)的人才去管理,這群人就是
Linux運(yùn)維工程師(Ops)。Ops的主要工作就是搭建運(yùn)行環(huán)境,讓程序員寫的代碼能夠高效、穩(wěn)定、安全地在服務(wù)器上運(yùn)行,他們屬于后勤部門。對(duì)Ops的要求并不比程序員低,優(yōu)秀的Ops擁有架設(shè)服務(wù)器集群的能力,還會(huì)編程開發(fā)常用的工具。Ops的工作細(xì)節(jié)內(nèi)容如下。(1)安裝操作系統(tǒng),如CentOS、Ubuntu等。(2)部署代碼運(yùn)行環(huán)境。例如,網(wǎng)站后臺(tái)語(yǔ)言采用PHP,就需要安裝Nginx、Apache、MySQL等。(3)及時(shí)修復(fù)漏洞,防止服務(wù)器被攻擊,包括Linux本身漏洞和各個(gè)軟件的漏洞。(4)根據(jù)項(xiàng)目需求升級(jí)軟件。例如,PHP7.0在性能方面取得了重大突破,如果現(xiàn)在服務(wù)器壓力比較大,就可以考慮將舊版的PHP5.x升級(jí)到PHP7.0。1.6Shell是運(yùn)維工程師必備技能(5)監(jiān)控服務(wù)器壓力,避免服務(wù)器死機(jī)。例如,淘寶在“雙十一”的時(shí)候會(huì)瞬間涌入大量用戶,導(dǎo)致部分服務(wù)器死機(jī),網(wǎng)頁(yè)無(wú)法訪問(wèn),甚至連支付寶都不能使用。(6)分析日志,及時(shí)發(fā)現(xiàn)代碼或者環(huán)境問(wèn)題,通知相關(guān)人員修復(fù)。這些任務(wù)只要登錄遠(yuǎn)程服務(wù)器,或者去機(jī)房連接服務(wù)器就能夠完成,如圖所示。1.6Shell是運(yùn)維工程師必備技能為什么要用
Shell
編程呢?這是因?yàn)镺ps面對(duì)的不是少量的服務(wù)器,而是成千上萬(wàn)臺(tái)服務(wù)器,如果把同樣的工作重復(fù)成千上萬(wàn)遍,等人工處理完,市場(chǎng)早已成一片紅海了。服務(wù)器一旦增多,必須把人力工作自動(dòng)化,運(yùn)行一段代碼就能在成千上萬(wàn)臺(tái)服務(wù)器上完成相同的工作,如服務(wù)的監(jiān)控、代碼快速部署、服務(wù)啟動(dòng)/停止、數(shù)據(jù)備份、日志分析等。Shell腳本很適合處理純文本類型的數(shù)據(jù),而Linux中絕大多數(shù)配置文件、日志文件(如NFS、rsync、HTTPD、Nginx、MySQL等)、啟動(dòng)文件都是純文本類型的文件。圖形象地展示了Shell在運(yùn)維工作中的地位。1.6Shell是運(yùn)維工程師必備技能在圖所示的運(yùn)維“手鏈”中,每顆“珍珠”都是一項(xiàng)服務(wù),將珍珠穿起來(lái)的“線”就是Shell。Shell腳本是實(shí)現(xiàn)Linux系統(tǒng)自動(dòng)管理以及自動(dòng)化運(yùn)維所必備的工具,Linux的底層以及基礎(chǔ)應(yīng)用軟件的核心大都涉及Shell腳本的內(nèi)容。每一個(gè)合格的Linux系統(tǒng)管理員或運(yùn)維工程師,都應(yīng)該能夠熟練地編寫Shell腳本,以提升運(yùn)維工作效率,減少不必要的重復(fù)勞動(dòng),為個(gè)人的職場(chǎng)發(fā)展奠定較好的基礎(chǔ)。變量是Shell程序運(yùn)行時(shí)使用的最小數(shù)據(jù)單元,也是Shell程序不可缺少的組成部分。本章主要講述Shell變量的具體用法,使讀者對(duì)Shell有更多的認(rèn)識(shí),并能在腳本中熟練使用Shell變量。1.7Shell變量的定義程序是在內(nèi)存中運(yùn)行的。在程序運(yùn)行過(guò)程中,內(nèi)存空間內(nèi)的某些值是變化的。這個(gè)內(nèi)存空間就稱為變量。為了便于操作,可以對(duì)這個(gè)空間進(jìn)行命名,這個(gè)名稱就是變量名。簡(jiǎn)單地說(shuō),變量就是用一個(gè)特定的字符串去表示不固定的內(nèi)容,變量的名稱必須是合法的標(biāo)識(shí)符。內(nèi)存空間內(nèi)的值就是變量值,在聲明變量時(shí)可以不賦值,也可以直接賦給初值。變量其實(shí)就是用來(lái)放置數(shù)值等內(nèi)容的”盒子”,想要使用這個(gè)可以存放數(shù)值等內(nèi)容的魔法盒,就必須遵循一定的規(guī)則,首先需要提前進(jìn)行如下定義。定義變量的語(yǔ)法格式如下:變量名=變量值;1.7Shell變量的定義代碼如下:在Shell中,當(dāng)?shù)谝淮问褂媚硞€(gè)變量名時(shí),實(shí)際上就定義了這個(gè)變量。如果沒有給出變量值,則變量會(huì)被賦值為一個(gè)空字符串。varName=varValue;
1.8Shell變量的類型1.8.1自定義變量返回目錄1.8.2環(huán)境變量1.8.3位置變量1.8.4預(yù)定義變量1.8Shell變量的類型Shell變量分為四類,分別為自定義變量、環(huán)境變量、位置變量和預(yù)定義變量。根據(jù)工作要求臨時(shí)定義的變量稱為自定義變量;環(huán)境變量一般是指用export內(nèi)置命令導(dǎo)出的變量,用于定義Shell的運(yùn)行環(huán)境,保證Shell命令的正確執(zhí)行,如$0、$1、$#;從命令行、函數(shù)或腳本執(zhí)行等處傳遞參數(shù)時(shí),$0、$1稱為特殊位置變量;預(yù)定義變量是在bash(Linux系統(tǒng)的默認(rèn)Shell)中已有的變量,可以直接使用,如$@、$*等。1.8Shell變量的類型1.8.1自定義變量自定義變量可以理解為局部變量或普通變量,只能在創(chuàng)建它們的Shell函數(shù)或Shell腳本中使用,自定義變量的說(shuō)明如表所示。自定義變量在Shell腳本中的使用。以上是ping通主機(jī)的腳本,使用自定義變量方式定義ip=,ping的結(jié)果放在/dev/null(稱垃圾箱)。1.8Shell變量的類型1.8.2環(huán)境變量環(huán)境變量也可稱為全局變量,可以在創(chuàng)建它們的Shell及其派生出來(lái)的任意子進(jìn)程Shell中使用。環(huán)境變量的說(shuō)明如表所示。系統(tǒng)中環(huán)境變量的配置文件有/etc/profile、~/.baserc和~/.bash_profile。其中/etc/profile這是系統(tǒng)最主要的Shell設(shè)置文件,也是用戶登陸時(shí)系統(tǒng)最先檢查的文件,有關(guān)重要的環(huán)境變量都定義在此,其中包括PATH、USER、LOGNAME、MAIL等。而在文件的最后,它會(huì)檢查并執(zhí)行/etc/profile.d/*.sh的腳本。1.8Shell變量的類型1.8.2環(huán)境變量例1-2環(huán)境變量應(yīng)用案例。上例中,首先自定義JAVA_HOME變量,然后使用export將JAVA_HOMEPATH自定義變量轉(zhuǎn)換為環(huán)境變量寫在PATH中。這樣就可以在其他用戶執(zhí)行JAVA命令或使用JAVA環(huán)境時(shí),系統(tǒng)將自動(dòng)識(shí)別環(huán)境變量。1.8Shell變量的類型1.8.3位置變量在Shell中存在一些位置變量。位置變量用于在命令行、函數(shù)或腳本中傳遞參數(shù),其變量名不用自己定義,其作用也是固定的。執(zhí)行腳本時(shí),通過(guò)在腳本后面給出具體的參數(shù)(多個(gè)參數(shù)用空格隔開)對(duì)相應(yīng)的位置變量進(jìn)行賦值。$0代表命令本身,$1-$9代表接收的第1~9個(gè)參數(shù),$10以上需要用{}括起來(lái),如${10}代表接收的第10個(gè)參數(shù)。1.8Shell變量的類型1.8.3位置變量位置參數(shù)在腳本中的使用。其中,$1表示腳本傳遞的第一個(gè)參數(shù),$2表示傳遞的第二個(gè)參數(shù)。此例中,給test.sh腳本執(zhí)行權(quán)限并運(yùn)行腳本,把傳入的tianyun參數(shù)賦值給腳本中的$1,把傳入的yangge參數(shù)賦值給腳本中的$2,因此輸出結(jié)果為tianyunyangge。1.8Shell變量的類型1.8.4預(yù)定義變量預(yù)定義變量在Shell中可以直接使用,位置變量也是預(yù)定義變量的一種。預(yù)定義變量如表所示。1.8Shell變量的類型1.8.4預(yù)定義變量預(yù)定義變量$?功能實(shí)戰(zhàn)。執(zhí)行pwd命令,然后用”echo$?”查看執(zhí)行命令的狀態(tài)返回值,返回值為0,表示上一個(gè)命令的執(zhí)行是成功的。1.9Shell變量的賦值1.9.1直接賦值返回目錄1.9.2從鍵盤讀入賦值1.9.3使用命令行參數(shù)賦值1.9.4利用命令的輸出結(jié)果賦值1.9.5從文件中讀入數(shù)據(jù)賦值1.9Shell變量的賦值Shell變量的賦值方式有五種:直接賦值、從鍵盤讀入賦值、使用命令行參數(shù)賦值、利用命令的輸出結(jié)果賦值和從文件中讀入數(shù)據(jù)賦值。直接賦值也就是定義變量;從鍵盤讀入賦值是指將bash的內(nèi)置命令read讀入的內(nèi)容賦值給變量;在命令行Shell下輸入的參數(shù)內(nèi)容稱為使用命令行參數(shù)賦值;利用命令行的輸出結(jié)果賦值是指將命令行的執(zhí)行結(jié)果賦值給變量;從文件中讀取賦值就是把文件內(nèi)容賦值給變量。1.9Shell變量的賦值1.9.1直接賦值在Shell中,當(dāng)?shù)谝淮问褂媚匙兞棵麜r(shí),實(shí)際上就已經(jīng)給變量賦值了。直接賦值的格式為”變量名=變量值”,如,name=tianyun。為了避免歧義,直接賦值時(shí)禁止在等號(hào)兩邊添加空格,這跟常見的編程語(yǔ)言有所不同。直接賦值舉例如下。上面語(yǔ)句中的”=”不是數(shù)學(xué)中的等號(hào),而是賦值運(yùn)算符,它的作用是將賦值運(yùn)算符右側(cè)的值賦給左側(cè),其中,右側(cè)的3就是變量的值,左側(cè)的a就是變量名,a被賦值后,a就代表了3。1.9Shell變量的賦值1.9.2從鍵盤讀入賦值在Shell腳本中,Shell變量可以通過(guò)從鍵盤讀入輸入的內(nèi)容并來(lái)賦值。命令格式為:read–p[提示信息]:[變量名]read命令被用來(lái)從標(biāo)準(zhǔn)輸入讀取單行數(shù)據(jù)。read命令使用演示如下。read從鍵盤讀入變量值。1.9Shell變量的賦值1.9.2從鍵盤讀入賦值以上結(jié)果可以看出,read命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值(這里的值為)賦值給Shell變量$ip。1.9Shell變量的賦值1.9.3使用命令行參數(shù)賦值使用命令行參數(shù)賦值是直接在命令后面跟參數(shù),系統(tǒng)用$1來(lái)調(diào)用第一個(gè)參數(shù),用$2調(diào)用第二個(gè)參數(shù),這種賦值方法適用于參數(shù)經(jīng)常變化且不需要交互的情況。在腳本中同時(shí)加入$1和$2,并進(jìn)行測(cè)試,具體如下所示。使用命令行參數(shù)賦值。從以上可以看出,測(cè)試腳本的內(nèi)容是顯示第一個(gè)參數(shù)$1和第二個(gè)參數(shù)$2,運(yùn)行腳本同時(shí)輸入兩個(gè)字符串參數(shù)qf和tianyun,則qf對(duì)應(yīng)第一個(gè)參數(shù)$1來(lái)顯示,tianyun對(duì)應(yīng)第二個(gè)參數(shù)$2。1.9Shell變量的賦值1.9.4利用命令的輸出結(jié)果賦值在Shell程序中,可以將一個(gè)命令的輸出結(jié)果當(dāng)作變量的值,不過(guò)需要在賦值語(yǔ)句中使用反向單引號(hào)。這種賦值方法可以直接處理上一個(gè)命令產(chǎn)生的數(shù)據(jù)。在生產(chǎn)環(huán)境中,把命令的結(jié)果作為變量的內(nèi)容進(jìn)行賦值的方法,在腳本開發(fā)時(shí)很常見,如按天打包網(wǎng)站的站點(diǎn)目錄程序,生成不同的文件名,具體如下所示。利用命令的輸出結(jié)果賦值。設(shè)置當(dāng)前日期(格式為2019-05-20)賦值給cmd變量,也就是說(shuō)date+%F命令的輸出結(jié)果賦值給cmd,然后用echo$cmd顯示出來(lái)。1.9Shell變量的賦值1.9.5從文件中讀入數(shù)據(jù)賦值這種方式就適合處理大批量的數(shù)據(jù),直接把相應(yīng)的數(shù)據(jù)寫入文件中,通過(guò)腳本中的命令把文件中的數(shù)據(jù)讀取到腳本程序中以便使用。通常是通過(guò)while循環(huán)一行行讀入數(shù)據(jù),即每循環(huán)一次,就從文件中讀入一行數(shù)據(jù),直到讀取到文件的結(jié)尾,具體如下所示。從文件中讀入數(shù)據(jù)賦值。1.9Shell變量的賦值1.9.5從文件中讀入數(shù)據(jù)賦值從以上代碼可以看出,文件execfile的內(nèi)容通過(guò)while循環(huán)被讀入到腳本中,并且每一行數(shù)據(jù)賦值給了LINE,之后使用echo顯示出來(lái)。這里文件的內(nèi)容讀取使用了while的輸入重定向。在Shell中,定義或引用變量應(yīng)注意一些問(wèn)題,如單引號(hào)、雙引號(hào)和反引號(hào)(``)的使用。使用單引號(hào)的情況下,不管引號(hào)里面的是否有變量或者其他的表達(dá)式,都是原樣輸出;如果定義變量時(shí)使用雙引號(hào),則引號(hào)里面的變量或者函數(shù)會(huì)先解析再輸出內(nèi)容,而不是把雙引號(hào)中的變量名以及命令原樣輸出;反引號(hào)的作用是命令調(diào)用。也就是說(shuō),想要顯示變量的值使用雙引號(hào),單引號(hào)中是沒有變量的,反引號(hào)等價(jià)于$(),反引號(hào)的Shell命令會(huì)被先執(zhí)行。1.9Shell變量的賦值1.9.5從文件中讀入數(shù)據(jù)賦值定義變量name=”tianyun”使用雙引號(hào)顯示結(jié)果如下:使用單引號(hào)顯示結(jié)果如下:反向單引號(hào)舉例說(shuō)明:等價(jià)于:1.10Shell變量的運(yùn)算1.10.1
expr數(shù)值運(yùn)算命令返回目錄1.10.2“(())”或“[]”數(shù)值運(yùn)算命令1.10.3
let數(shù)值運(yùn)算命令1.10.4
Shell小數(shù)運(yùn)算1.10Shell變量的運(yùn)算在Linux的Shell中,變量值的類型默認(rèn)是字符串,不能直接進(jìn)行運(yùn)算,如果需要對(duì)Shell變量進(jìn)行運(yùn)算,需要使用特殊方法。Shell中用于整數(shù)運(yùn)算的方法有expr、(())和$[]。Shell也可以對(duì)小數(shù)進(jìn)行運(yùn)算,接下來(lái)逐一詳細(xì)講解Shell中各種運(yùn)算符號(hào)及運(yùn)算命令。1.10Shell變量的運(yùn)算1.10.1expr數(shù)值運(yùn)算命令expr命令既可以用于整數(shù)運(yùn)算,也可以用于相關(guān)字符串長(zhǎng)度、匹配等運(yùn)算處理。語(yǔ)法格式為exprexpression,即expr命令加表達(dá)式,具體如下所示。expr數(shù)值運(yùn)算命令。在使用expr時(shí),需要注意運(yùn)算符及用于計(jì)算的數(shù)字兩邊必須有空格,否則會(huì)執(zhí)行失敗。另外,expr也支持乘號(hào)運(yùn)算,在使用乘號(hào)運(yùn)算時(shí)必須用反斜線轉(zhuǎn)義,因?yàn)镾hell可能將其誤解為*號(hào)。1.10Shell變量的運(yùn)算1.10.2“(())”或“[]”數(shù)值運(yùn)算命令雙小括號(hào)“(())”的作用是進(jìn)行整數(shù)運(yùn)算和數(shù)值比較,其效率很高,用法也非常靈活,是企業(yè)中常見的運(yùn)算操作符,格式為“((表達(dá)式))”,或“[表達(dá)式]”,括號(hào)內(nèi)部?jī)蓚?cè)可以有空格,也可省空格;需要直接輸出運(yùn)算表達(dá)式的運(yùn)算結(jié)果時(shí),可以在“((表達(dá)式))”前加$符。“(())”或“[]”數(shù)值運(yùn)算命令。以上腳本定義num1=10,num2=20,運(yùn)算采用雙小括號(hào)或中括號(hào)的格式,再用echo把運(yùn)算結(jié)果顯示出來(lái)。1.10Shell變量的運(yùn)算1.10.3let數(shù)值運(yùn)算命令let數(shù)值符號(hào)可以直接進(jìn)行計(jì)算,且不帶回顯功能,也就是說(shuō)當(dāng)使用let的時(shí)候,不再使用$引用變量。let運(yùn)算命令的語(yǔ)法格式為:let賦值表達(dá)式,其功能等同于“((賦值表達(dá)式))”,具體如下所示。let運(yùn)算命令的用法。以上代碼演示了是否使用let進(jìn)行賦值的區(qū)別,首先給一個(gè)值為2的sum自加8,不用let進(jìn)行賦值運(yùn)算時(shí),則輸出結(jié)果為sum+8;取消變量時(shí),sum再次被賦值為2,采用let賦值后,則輸出結(jié)果為10。1.10Shell變量的運(yùn)算1.10.4Shell小數(shù)運(yùn)算bc是Unix/Linux下的計(jì)算器,它還可以作為命令進(jìn)行小數(shù)運(yùn)算,用于交互和非交互,但一般用到的較少,具體如下所示。Shell小數(shù)運(yùn)算。以上利用echo輸出表達(dá)式,通過(guò)管道給bc計(jì)算,此方法效率較低。1.11Shell變量的刪除、替換和替代1.11.1
Shell變量的刪除返回目錄1.11.2Shell變量的替換1.11.3
Shell變量的替代1.11Shell變量的刪除、替換和替代Linux提供了一些可以直接對(duì)變量進(jìn)行操作的符號(hào)。通過(guò)這些符號(hào),變量中的部分內(nèi)容可以被刪除、替換和替代。在Shell變量中,變量的刪除、替換和替代也是非常重要的。通過(guò)簡(jiǎn)單的操作修改變量,可以減少代碼的行數(shù)并提高可讀性。1.11Shell變量的刪除、替換和替代1.11.1Shell變量的刪除變量刪除的操作方式,如表所示。具體示例如下。1.11Shell變量的刪除、替換和替代1.11.1Shell變量的刪除Shell變量的刪除。1.11Shell變量的刪除、替換和替代1.11.2Shell變量的替換在日常工作中,常常需要判斷某個(gè)變量是否存在,若變量存在則使用既有的配置,若變量不存在,則給予一個(gè)常用的配置。變量替換的操作方式如表所示。Shell變量的替換。1.11Shell變量的刪除、替換和替代1.11.3Shell變量的替代在某些情況下,給一些變量設(shè)置默認(rèn)值是比較有意義的。例如,在連接數(shù)據(jù)庫(kù)時(shí),需要使用端口,這個(gè)端口可以是預(yù)先設(shè)置的具體端口,也可以是用戶輸入的端口。假如用戶沒有輸入具體的端口號(hào),腳本中就使用預(yù)先設(shè)置的端口。給Shell變量設(shè)置默認(rèn)值的格式為”${變量名-新的變量名}”,如果變量名沒有被賦值,會(huì)使用”新的變量值”替代,如果變量已被賦值(包括空值),則該值不會(huì)被替代,具體如下所示。Shell變量的替代。1.12Shell變量的自增Shell變量的自增運(yùn)算符是i++和++i。i++表示先賦值再自加,++i表示先自加再賦值。這一節(jié)講解i++和++i分別對(duì)變量值的影響和對(duì)表達(dá)式的影響,在運(yùn)維工作中,這兩個(gè)自增運(yùn)算符還是比較實(shí)用的,要求讀者理解并運(yùn)用。i++和++i對(duì)變量的值的影響??梢钥闯?,不管是先賦值再自加還是先自加在賦值,其結(jié)果都是一樣的。接下來(lái)看另外一個(gè)例子。1.12Shell變量的自增以上代碼可以看出,先賦值再自加運(yùn)算和先自加運(yùn)算再賦值,表達(dá)式結(jié)果是不一樣的。1.13Shell變量中的特殊符號(hào)在日常運(yùn)維工作中,靈活使用特殊符號(hào)是很重要的。例如,“#”用在行首表示程序開頭的注釋;“;”作為命令的分隔符,分隔同一行上兩個(gè)或者兩個(gè)以上的命令。接下來(lái)演示常見的特殊符號(hào)的用法,具體如下所示?!?”表示注釋。行首為#(#!是個(gè)例外)表示此行是注釋。注釋也可以放在本行命令的后面,需要注意的是#兩邊有空格。注釋也可以放在本行行首空白的后面。1.13Shell變量中的特殊符號(hào)注意,命令是不能放在同一行注釋后邊的,因?yàn)樽⑨専o(wú)法結(jié)束,同一行中后邊的代碼就無(wú)法生效,只能執(zhí)行下一個(gè)命令。當(dāng)然,在echo中轉(zhuǎn)義的#是不能作為注釋號(hào)的。同樣,#也可以出現(xiàn)在特定的參數(shù)替換結(jié)構(gòu)中,或出現(xiàn)在數(shù)字常量表達(dá)式中。舉例如下?!?”在同一行中分隔兩個(gè)或者兩個(gè)以上的命令。1.13Shell變量中的特殊符號(hào)當(dāng)然,“;”也適用于循環(huán)語(yǔ)句,具體代碼演示如下?!?;”用于終止case選項(xiàng)。1.13Shell變量中的特殊符號(hào)“.”等價(jià)于source命令。它是bash中的一個(gè)內(nèi)建命令?!?”也可以作為文件名的一部分,如果“.”放在文件名的開頭,那么這個(gè)文件將會(huì)成為“隱藏文件”,ls命令將不會(huì)正常顯示出這個(gè)文件。具體舉例代碼參考教材1.7節(jié)第例1-21。當(dāng)點(diǎn)作為目錄名時(shí),一個(gè)單獨(dú)的點(diǎn)代表當(dāng)前的工作目錄,而兩個(gè)點(diǎn)表示上一級(jí)目錄。具體如下所示。1.13Shell變量中的特殊符號(hào)空命令“:”和true命令作用相同。在while死循環(huán)和if/then中也可使用這個(gè)命令,具體如下所示。1.13Shell變量中的特殊符號(hào)在if/then中使用冒號(hào)引出分支,具體如下所示。反引號(hào)命令被調(diào)用時(shí),可以使用冒號(hào),具體如下所示。1.13Shell變量中的特殊符號(hào)“$”表示變量替換或引用變量的內(nèi)容。以上代碼是在一個(gè)變量前面加上“$”來(lái)引用這個(gè)變量的值?!?”還可以用在行尾,作為行結(jié)束符。各種特殊符號(hào)的含義如表參考教材1.7節(jié)。本章主要對(duì)Shell中各種變量進(jìn)行了講解,要求讀者掌握Shell中不同的符號(hào),以及它們?cè)诓煌瑘?chǎng)合的使用方法,能夠準(zhǔn)確快速地利用它們寫出Shell腳本,來(lái)完成日常運(yùn)維工作。本章小結(jié)第2章Shell條件測(cè)試Shell中的條件測(cè)試語(yǔ)句if條件語(yǔ)句case條件語(yǔ)句case條件語(yǔ)句案例實(shí)戰(zhàn)Shell中的條件測(cè)試語(yǔ)句2.1if條件語(yǔ)句2.2?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)case條件語(yǔ)句2.3case條件語(yǔ)句案例2.4?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)學(xué)習(xí)目標(biāo)掌握掌握掌握掌握掌握Shell中的條件測(cè)試語(yǔ)句1掌握使用if和case條件語(yǔ)句編寫腳本42掌握if條件語(yǔ)句3掌握case條件語(yǔ)句Shell腳本就是各種Bash命令、判斷和循環(huán)語(yǔ)句的集合,如Linux命令、if條件語(yǔ)句、for循環(huán)語(yǔ)句等,也就是說(shuō)shell腳本把含有邏輯運(yùn)算的一段可執(zhí)行的代碼寫在了程序文件中。本章主要講解if和case條件測(cè)試,要求讀者掌握if條件語(yǔ)句和case條件語(yǔ)句的語(yǔ)法和實(shí)際應(yīng)用。2.1Shell中的條件測(cè)試語(yǔ)句2.1.1文件測(cè)試返回目錄2.1.2整數(shù)測(cè)試2.1.3字符串測(cè)試2.1.4邏輯運(yùn)算符2.1Shell中的條件測(cè)試語(yǔ)句在Shell中,各種條件結(jié)構(gòu)通常都需要進(jìn)行各種測(cè)試,然后根據(jù)測(cè)試結(jié)果執(zhí)行不同的操作,測(cè)試判斷有時(shí)也會(huì)與if等條件語(yǔ)句相結(jié)合,以減少程序運(yùn)行的錯(cuò)誤。在Shell中,對(duì)指定的條件進(jìn)行判斷,執(zhí)行條件測(cè)試表達(dá)式后通常會(huì)返回“真”或“假”,就像執(zhí)行命令后的返回值為0表示真、非0表示假一樣。接下來(lái)詳細(xì)介紹各種測(cè)試語(yǔ)句。2.1Shell中的條件測(cè)試語(yǔ)句2.1.1文件測(cè)試在Shell編程中,通常使用test命令進(jìn)行條件測(cè)試,語(yǔ)法形式為“test<測(cè)試表達(dá)式>”。注意,利用test命令進(jìn)行條件測(cè)試表達(dá)式的時(shí),test命令和“<測(cè)試表達(dá)式>”之間至少有一個(gè)空格,如例所示。語(yǔ)句test-f參數(shù)用于判斷file是否存在且是否為普通文件,如果file存在且為普通文件,則輸出true,否則輸出false。除了test可以使用“<測(cè)試表達(dá)式>”外,還有一種方式可以使用“<測(cè)試表達(dá)式>”,就是使用中括號(hào),語(yǔ)法格式為“[<測(cè)試表達(dá)式>]”通過(guò)[]進(jìn)行條件測(cè)試的方法,與test命令用法相同,推薦使用此方法,具體如下所示。2.1Shell中的條件測(cè)試語(yǔ)句2.1.1文件測(cè)試以上語(yǔ)句和使用test命令效果一樣,表示為如果file文件存在,則輸出1,否則輸出0。文件測(cè)試操作符如表所示。2.1Shell中的條件測(cè)試語(yǔ)句2.1.2整數(shù)測(cè)試整數(shù)測(cè)試通常用于數(shù)值之間的運(yùn)算,其語(yǔ)法格式為[整數(shù)1操作符整數(shù)2]或test整數(shù)1操作符整數(shù)2。整數(shù)測(cè)試操作符如表所示。2.1Shell中的條件測(cè)試語(yǔ)句2.1.2整數(shù)測(cè)試下面演示整數(shù)測(cè)試的使用場(chǎng)景。以上代碼是測(cè)試主機(jī)是否是正常,使用while循環(huán),設(shè)置i的初值為1,如果i小于等于5且$?執(zhí)行結(jié)果為0,則主機(jī)是正常狀態(tài)。2.1Shell中的條件測(cè)試語(yǔ)句2.1.2整數(shù)測(cè)試另外也可以使用C語(yǔ)言中的關(guān)系運(yùn)算符,用于比較兩個(gè)變量的大小,比較的結(jié)果是一個(gè)布爾值,即true或false。注意要用雙小括號(hào)(())。關(guān)系運(yùn)算符如表所示。2.1Shell中的條件測(cè)試語(yǔ)句2.1.2整數(shù)測(cè)試關(guān)系運(yùn)算符2.1Shell中的條件測(cè)試語(yǔ)句2.1.3字符串測(cè)試字符串測(cè)試操作符的作用包括比較字符串是否相同、測(cè)試字符串的長(zhǎng)度是否為0。書寫表達(dá)式為[字符串1=字符串2]、[字符串1!=字符串2]或[-z字符串]。字符串測(cè)試運(yùn)算符如表所示。2.1Shell中的條件測(cè)試語(yǔ)句2.1.3字符串測(cè)試字符串測(cè)試腳本。以上是安裝服務(wù)的腳本,判斷變量user的值是否為root,如果為root則安裝httpd,如果不是root,則顯示”你沒有權(quán)限”。2.1Shell中的條件測(cè)試語(yǔ)句2.1.4邏輯運(yùn)算符在Shell條件測(cè)試中,使用邏輯運(yùn)算符實(shí)現(xiàn)復(fù)雜的條件測(cè)試,邏輯運(yùn)算符用于操作兩個(gè)變量。邏輯運(yùn)算符語(yǔ)法格式?;颍哼壿嫴僮鞣绫硭荆ㄗ⒁猓?a和-o放在[]里面用,&&和||放在[]外面用)。2.1Shell中的條件測(cè)試語(yǔ)句2.1.4邏輯運(yùn)算符-a和&&的運(yùn)算規(guī)則。以上測(cè)試只有邏輯操作符兩邊的表達(dá)式都為真,則結(jié)果為真,輸出1,否則為假,對(duì)應(yīng)的數(shù)字為0。2.2if條件語(yǔ)句2.2.1
if單分支返回目錄2.2.2if雙分支2.2.3
if多分支2.2.4
if語(yǔ)句配置yum源實(shí)戰(zhàn)腳本2.2if條件語(yǔ)句流程控制語(yǔ)句有三類,分別為順序語(yǔ)句,分支語(yǔ)句(條件語(yǔ)句),循環(huán)語(yǔ)句。對(duì)于if條件語(yǔ)句可以簡(jiǎn)單理解為漢語(yǔ)中的“如果…….,那么……”if條件語(yǔ)句在實(shí)際生產(chǎn)工作中使用最頻繁,也是最重要的語(yǔ)句,因此要求讀者必須牢固掌握。2.2if條件語(yǔ)句2.2.1if單分支if條件語(yǔ)句的單分支結(jié)構(gòu)語(yǔ)法格式為?;颍好總€(gè)if條件語(yǔ)句都以if開頭,并帶有then,最后以fi結(jié)尾,if單分支結(jié)構(gòu)主體是“如果……,那么……”表示為如果條件表達(dá)式的結(jié)果為真,則執(zhí)行代碼塊中代碼;如果條件表達(dá)式為假,則不執(zhí)行,接下來(lái)演示if單分支語(yǔ)句的用法。2.2if條件語(yǔ)句2.2.1if單分支if單分支語(yǔ)句判斷文件是否存在。以上代碼用if單分支語(yǔ)句判斷文件/etc/hosts是否存在,如果存在,則返回1。2.2if條件語(yǔ)句2.2.2if雙分支if條件語(yǔ)句的單分支結(jié)構(gòu)主體就是“如果……,那么……”,而if條件語(yǔ)句的雙分支結(jié)構(gòu)主體則為“如果……,那么……,否則……”if條件語(yǔ)句的雙分支結(jié)構(gòu)語(yǔ)法格式為:另外,if雙分支結(jié)構(gòu)主體也可以把then和if放在一行用分號(hào)(;)隔開,表示如果條件表達(dá)式為真,那么執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。接下來(lái)演示if語(yǔ)句的用法,具體如下所示:2.2if條件語(yǔ)句2.2.2if雙分支判斷定義的名字是否為空。以上示例是判斷$name是否為空,如果$name為空,則結(jié)果顯示為yes,否則結(jié)果顯示為no。2.2if條件語(yǔ)句2.2.3if多分支if條件語(yǔ)句多分支結(jié)構(gòu)的主體為“如果……就……,否則……就……,否則……”。if條件語(yǔ)句的多分支結(jié)構(gòu)語(yǔ)法格式為:注意多分支elif的寫法,每個(gè)elif都要帶有then,最后結(jié)尾的else后面沒有then。根據(jù)if條件語(yǔ)句多分支結(jié)構(gòu)的主體為:“如果……就……,否則……就……,否則……?!北硎緸槿绻麠l件表達(dá)式1為真,那么執(zhí)行代碼塊1;或者條件代碼塊2為真,就執(zhí)行代碼塊2;或者條件表達(dá)式3為真,就執(zhí)行代碼塊3;否則執(zhí)行代碼塊4。2.2if條件語(yǔ)句2.2.3if多分支if條件語(yǔ)句安裝Apache。2.2if條件語(yǔ)句2.2.3if多分支以上代碼先是判斷DNS解析是否正常,如果返回值為0,則表示DNS正常,開始安裝HTTP服務(wù);否則判斷網(wǎng)關(guān)是否正常,假如正常,則提示檢查DNS,否則檢查IP地址是否正確。2.2if條件語(yǔ)句2.2.4if語(yǔ)句配置yum源實(shí)戰(zhàn)腳本根據(jù)當(dāng)前的操作系統(tǒng)版本,配置不同的yum源兼容的版本,下面是使用if多分支結(jié)構(gòu)編寫的根據(jù)系統(tǒng)版本配置yum源的腳本,具體如下所示。多系統(tǒng)配置yum源腳本。具體案例詳情參考教材2.2.4節(jié)。2.3case條件語(yǔ)句case條件語(yǔ)句相當(dāng)于多分支的if/elif/else條件語(yǔ)句,由于if語(yǔ)句看起來(lái)略微復(fù)雜,case條件語(yǔ)句看起來(lái)比if語(yǔ)句更加簡(jiǎn)潔工整,故此case常應(yīng)用在實(shí)現(xiàn)系統(tǒng)服務(wù)啟動(dòng)腳本等企業(yè)應(yīng)用場(chǎng)景中。下面介紹case條件語(yǔ)句的語(yǔ)法。在Shell編程中,case語(yǔ)句有固定的語(yǔ)法格式。其語(yǔ)法格式為:2.3case條件語(yǔ)句在case語(yǔ)句中,程序會(huì)獲取case語(yǔ)句中的變量值,如果變量值滿足條件表達(dá)式1,則執(zhí)行代碼塊1;如果滿足條件表達(dá)式2,則執(zhí)行代碼塊2;如果滿足條件表達(dá)式3,則執(zhí)行代碼塊3;執(zhí)行到雙分號(hào)(;;)停止,如果都不滿足,則執(zhí)行*)后面的代碼塊(此處的雙分號(hào)可以省略)只要滿足一個(gè)條件表達(dá)式就會(huì)跳出case語(yǔ)句主體,執(zhí)行esac字符后面的命令。條件表達(dá)式匹配如表所示。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.1
case刪除用戶判斷返回目錄2.4.2case實(shí)現(xiàn)系統(tǒng)工具箱的使用2.4.3
case實(shí)現(xiàn)jumpserver2.4.4
case實(shí)現(xiàn)多版本PHP安裝2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.1case刪除用戶判斷case語(yǔ)句結(jié)合read命令(讀入用戶輸入的內(nèi)容),與對(duì)應(yīng)的變量名建立關(guān)聯(lián),如果用戶輸入正確的內(nèi)容,返回一個(gè)結(jié)果;如果輸入其他內(nèi)容,返回另外一個(gè)結(jié)果。首先用if條件語(yǔ)句寫一個(gè)刪除用戶的腳本。if語(yǔ)句刪除用戶腳本。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.1case刪除用戶判斷使用if語(yǔ)句實(shí)現(xiàn)提示用戶輸入信息并賦值給user變量,如果返回值不等于0,則顯示沒有這個(gè)用戶,否則用戶存在。然后,根據(jù)腳本提示信息刪除用戶操作。接下來(lái)演示case語(yǔ)句刪除用戶的用法,具體案例詳情參考教材2.4.1節(jié)。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.2case實(shí)現(xiàn)系統(tǒng)工具的使用系統(tǒng)工具箱就是查看系統(tǒng)情況,如內(nèi)存大小、磁盤負(fù)載、CPU大小。接下來(lái)演示case條件語(yǔ)句實(shí)現(xiàn)簡(jiǎn)單的系統(tǒng)工具箱的腳本,具體案例詳情參考教材2.4.2節(jié)。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.3case實(shí)現(xiàn)jumpserverjumpserver是一款由Python編寫開源的跳板機(jī)(堡壘機(jī))系統(tǒng),實(shí)現(xiàn)了跳板機(jī)應(yīng)有的功能。它是基于SSH協(xié)議來(lái)管理的,客戶端無(wú)須安裝agent。相信諸位對(duì)跳板機(jī)(堡壘機(jī))不會(huì)陌生,為了保證服務(wù)器安全,加個(gè)堡壘機(jī),所有SSH協(xié)議連接都通過(guò)堡壘機(jī)來(lái)完成,堡壘機(jī)也需要有身份認(rèn)證,訪問(wèn)控制,審計(jì)等功能。下面主要是用case條件語(yǔ)句來(lái)實(shí)現(xiàn)跳板機(jī)。整個(gè)架構(gòu)設(shè)計(jì),用戶以alice用戶登錄到跳板機(jī),在跳板機(jī)上用case編寫個(gè)腳本跳轉(zhuǎn)到后端的三個(gè)服務(wù)器,分別為web1、web2、mysql1。指定用戶登錄到系統(tǒng)就會(huì)執(zhí)行腳本,執(zhí)行腳本的命令放在alice用戶根目錄的.bashrc_profile文件中。其中,用戶登錄到跳板機(jī)可以有兩個(gè)方式認(rèn)證,一種是密碼認(rèn)證,另外一種是密鑰認(rèn)證。接下來(lái)演示case條件語(yǔ)句實(shí)現(xiàn)跳板機(jī)的用法,具體案例詳情參考教材2.4.3節(jié)。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.3case實(shí)現(xiàn)jumpserver通過(guò)密鑰認(rèn)證腳本,先通過(guò)ssh-keygen生成公鑰,然后將公鑰推送到各個(gè)主機(jī)。密鑰認(rèn)證完成后,把腳本放在alice用戶的.bashrc_profile文件中,這樣用戶登錄到系統(tǒng)就會(huì)執(zhí)行這個(gè)腳本,下面是case語(yǔ)句實(shí)現(xiàn)jumpserver腳本。具體案例詳情參考教材2.4.3節(jié)。2.4case條件語(yǔ)句案例實(shí)戰(zhàn)2.4.4case實(shí)現(xiàn)多版本PHP安裝PHP是重要的中間件,PHP具有強(qiáng)大場(chǎng)景實(shí)現(xiàn)功能。PHP主要用于服務(wù)端的腳本程序,可以用它完成CGI程序能完成的工作,如收集表單數(shù)據(jù),生成動(dòng)態(tài)網(wǎng)頁(yè),發(fā)送或接收cookies。PHP的功能遠(yuǎn)不局限于此。case條件語(yǔ)句實(shí)現(xiàn)多版本PHP安裝,具體案例詳情參考教材2.4.3節(jié)。讀者通過(guò)本章的學(xué)習(xí),應(yīng)初步了解Shell編程中條件測(cè)試及流程控制,重點(diǎn)掌握if條件語(yǔ)句和case條件語(yǔ)句的語(yǔ)法,能夠快速編寫腳本。本章小結(jié)第3章Shell循環(huán)for循環(huán)語(yǔ)法結(jié)構(gòu)for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)expect交互式公鑰推送while循環(huán)和until循環(huán)循環(huán)語(yǔ)句案例實(shí)戰(zhàn)Shell的并發(fā)控制Shell的并發(fā)控制案例實(shí)戰(zhàn)for循環(huán)語(yǔ)法結(jié)構(gòu)3.1for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)expect交互式公鑰推送3.3while循環(huán)和until循環(huán)3.4?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5Shell的并發(fā)控制3.6?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)學(xué)習(xí)目標(biāo)了解掌握掌握掌握了解Shell循環(huán)的語(yǔ)法1掌握f(shuō)or循環(huán)用法42掌握Shell循環(huán)的用法3掌握while循環(huán)用法循環(huán)語(yǔ)句常用于對(duì)一條命令或多條命令重復(fù)執(zhí)行多次,與其他語(yǔ)言類似,Shell語(yǔ)言支持的循環(huán)有常見的四種:for、while、until、select循環(huán)語(yǔ)句,工作中常用的是for、while、until。3.1for循環(huán)語(yǔ)法結(jié)構(gòu)for循環(huán)主要用于固定次數(shù)的循環(huán),而不是用于守護(hù)進(jìn)程及無(wú)限循環(huán)。for循環(huán)語(yǔ)句常見的語(yǔ)法有兩種。下面將對(duì)for循環(huán)語(yǔ)句進(jìn)行詳盡地講解。第一種for循環(huán)的語(yǔ)法結(jié)構(gòu)如下所示:在Shell語(yǔ)言for循環(huán)語(yǔ)句中,for關(guān)鍵字后面會(huì)有一個(gè)“變量名”,變量名依次獲取in關(guān)鍵字后面的變量取值表內(nèi)容(以空格分隔),每次僅取一個(gè),然后進(jìn)入循環(huán)(do和done之間的部分)執(zhí)行循環(huán)內(nèi)的所有指令,當(dāng)執(zhí)行到done時(shí)結(jié)束本次循環(huán)。之后“變量名”再繼續(xù)獲取變量列表里的下一個(gè)變量值,繼續(xù)執(zhí)行循環(huán)內(nèi)的所有指令,當(dāng)執(zhí)行到done時(shí)結(jié)束并返回,以此類推,直到獲取變量列表里的最后一個(gè)值,并進(jìn)入循環(huán)執(zhí)行到done結(jié)束為止。3.1for循環(huán)語(yǔ)法結(jié)構(gòu)具體舉例如下所示。for循環(huán)語(yǔ)句的用法1。上述中參數(shù)隊(duì)列為1至5,因此執(zhí)行5次do關(guān)鍵字后的語(yǔ)句,具體結(jié)果如下所示。第二種for循環(huán)語(yǔ)法結(jié)構(gòu)風(fēng)格如下:3.1for循環(huán)語(yǔ)法結(jié)構(gòu)Shell語(yǔ)言中for循環(huán)語(yǔ)句可以寫成一行語(yǔ)句,具體形式如上所示,for循環(huán)語(yǔ)句的具體執(zhí)行流程不再重復(fù)講解,需要注意的是for循環(huán)語(yǔ)句寫成同一行后要使用“;”號(hào)將語(yǔ)句進(jìn)行分隔,否則編譯器會(huì)報(bào)錯(cuò),具體如下所示。for循環(huán)語(yǔ)句的用法2。如果編寫過(guò)程中缺失分號(hào)將會(huì)報(bào)錯(cuò),報(bào)錯(cuò)情況如下所示。3.1for循環(huán)語(yǔ)法結(jié)構(gòu)for循環(huán)執(zhí)行流程的邏輯如圖所示。3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.1for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)返回目錄3.2.2for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建3.2.3for循環(huán)語(yǔ)句實(shí)現(xiàn)文件中批量用戶創(chuàng)建3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.1for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)在生產(chǎn)環(huán)境中,查看主機(jī)是否為存活狀態(tài)是很重要的,當(dāng)主機(jī)數(shù)量較多時(shí),一次次的手動(dòng)查看主機(jī)狀態(tài),不僅工作量大,而且工作效率很低。這時(shí)就需要編寫一個(gè)實(shí)現(xiàn)批量主機(jī)探測(cè)的腳本。下面是for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)的用法,具體如下所示。3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.1for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)。3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.1for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)ping探測(cè)for循環(huán)已經(jīng)知道要進(jìn)行幾次循環(huán),例如,上例中主機(jī)個(gè)數(shù)是從2到254,對(duì)每臺(tái)主機(jī)都ping一次,如果返回值為0,則屏幕打印出IP地址,并將IP地址保存到ip.txt文件中。3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.2for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建批量創(chuàng)建用戶在運(yùn)維工作需求中也是很常見的,接下來(lái)演示for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建的用法。for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建。具體案例詳情參考教材3.2.2節(jié)。3.2for循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.2.3for循環(huán)語(yǔ)句實(shí)現(xiàn)文件中批量用戶創(chuàng)建實(shí)現(xiàn)文件中批量用戶創(chuàng)建的原理是先把批量用戶和密碼放在某一個(gè)文本文件中,然后寫for循環(huán)語(yǔ)句調(diào)用這個(gè)文件,這個(gè)文本文件中的用戶和密碼如下:接下來(lái)演示for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建的用法。for循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建。具體案例詳情參考教材3.2.3節(jié)。3.3expect交互式公鑰推送3.3.1
expect實(shí)現(xiàn)非交互登錄返回目錄3.3.2expect實(shí)現(xiàn)非交互傳輸文件3.3.3
expect實(shí)現(xiàn)批量主機(jī)公鑰推送3.3.4
for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)密碼3.3.5
for循環(huán)語(yǔ)句實(shí)現(xiàn)批量遠(yuǎn)程主機(jī)SSH配置3.3.1expect實(shí)現(xiàn)非交互登錄在現(xiàn)今的企業(yè)運(yùn)維中,自動(dòng)化運(yùn)維已經(jīng)成為主流趨勢(shì),但是在很多情況下,執(zhí)行系統(tǒng)命令或程序時(shí),系統(tǒng)會(huì)以交互式的形式要求運(yùn)維人員輸入指定的字符串,之后才能繼續(xù)執(zhí)行命令,這樣的方式,對(duì)于多個(gè)服務(wù)器來(lái)說(shuō)非常麻煩。用expect實(shí)現(xiàn)更簡(jiǎn)單、方便、快捷,例如,使用SSH遠(yuǎn)程連接服務(wù)器時(shí),第一次連接要和系統(tǒng)實(shí)現(xiàn)兩次交互式輸入。其代碼如下。3.3expect交互式公鑰推送3.3.1expect實(shí)現(xiàn)非交互登錄expect是一個(gè)用來(lái)實(shí)現(xiàn)自動(dòng)交互的軟件,無(wú)須人工干預(yù),如SSH、FTP遠(yuǎn)程連接等,正常情況下都需要手工交互,而expect可以模擬手工交互的過(guò)程,實(shí)現(xiàn)與遠(yuǎn)端程序的自動(dòng)化交互,從而達(dá)到自動(dòng)化運(yùn)維的目的。例如,運(yùn)維工作中為了批量傳輸文件、批量遠(yuǎn)程命令執(zhí)行(如修改密碼、安裝軟件),客戶端要連到服務(wù)器端利用expect的功能實(shí)現(xiàn)自動(dòng)交互,也可以根據(jù)密鑰認(rèn)證(公鑰認(rèn)證)把密碼推送到服務(wù)器上,一旦實(shí)現(xiàn)了公鑰認(rèn)證,則取消交互。接下來(lái)演示expect實(shí)現(xiàn)SSH非交互登錄的用法。具體如下所示。3.3expect交互式公鑰推送3.3.1expect實(shí)現(xiàn)非交互登錄expect實(shí)現(xiàn)SSH非交互登錄。3.3expect交互式公鑰推送3.3.1expect實(shí)現(xiàn)非交互登錄以上代碼中,首行指定用來(lái)執(zhí)行該腳本的命令解釋器,表示程序用expect解釋。使用expect的spawn命令開啟腳本和命令的會(huì)話,這里啟動(dòng)的是ssh命令,spawn必須使用,不然無(wú)法實(shí)現(xiàn)交互。隨后,expect和send命令用來(lái)實(shí)現(xiàn)交互過(guò)程,腳本首先等待用戶輸入信息,當(dāng)腳本得到字符串時(shí),expext將發(fā)送回車。最后腳本等待命令退出,一旦接收到標(biāo)識(shí)已經(jīng)結(jié)束的eof字符,expect腳本也就退出結(jié)束。由于第一次執(zhí)行ssh命令,要輸入yes和password交互,執(zhí)行完成后保存交互狀態(tài),把控制權(quán)交給控制臺(tái),此時(shí)即可對(duì)遠(yuǎn)程服務(wù)器進(jìn)行相關(guān)操作;如果沒有Interact,登錄完成后會(huì)退出,而不是保留在遠(yuǎn)程終端上。3.3expect交互式公鑰推送3.3.2expect實(shí)現(xiàn)非交互傳輸文件使用expect非交互式腳本與scp命令結(jié)合,實(shí)現(xiàn)scp批量傳輸本地不同文件到不同的遠(yuǎn)程主機(jī)的不同路徑。需要注意的是確保主機(jī)已經(jīng)安裝expect,目標(biāo)主機(jī)非第一次登陸scp時(shí),不需要輸入yes。還需要注意列表文件與變量的順序,接下來(lái)演示expect實(shí)現(xiàn)scp非交互傳輸文件的用法。具體如下所示。3.3expect交互式公鑰推送3.3.2expect實(shí)現(xiàn)非交互傳輸文件expect實(shí)現(xiàn)scp非交互傳輸文件。3.3expect交互式公鑰推送3.3.2expect實(shí)現(xiàn)非交互傳輸文件執(zhí)行結(jié)果如下:3.3expect交互式公鑰推送遠(yuǎn)程主機(jī)41驗(yàn)證:3.3.3expect實(shí)現(xiàn)批量主機(jī)公鑰推送接下來(lái)演示以ping通主機(jī),用Shell和expect實(shí)現(xiàn)批量主機(jī)公鑰推送的用法。expect實(shí)現(xiàn)批量主機(jī)公鑰推送。具體案例詳情參考教材3.3.3節(jié)。特別要說(shuō)明的是,ssh-keygen自帶選項(xiàng)-P(指定密碼為空),-f(指定用來(lái)保存密鑰的文件名),不需要使用expect就可以免交互的操作,只需要ssh-keygen-P“”-f~/.ssh/ida_rsa這個(gè)命令即可。3.3expect交互式公鑰推送3.3.3expect實(shí)現(xiàn)批量主機(jī)公鑰推送具體代碼如下所示。3.3expect交互式公鑰推送3.3.3expect實(shí)現(xiàn)批量主機(jī)公鑰推送這是一個(gè)使用Shell和expect無(wú)須做任何配置一鍵就實(shí)現(xiàn)批量分發(fā)密鑰的腳本,前提是本地主機(jī)已經(jīng)裝了expect,并且推送的主機(jī)能夠ping通。執(zhí)行結(jié)果驗(yàn)證如下:3.3expect交互式公鑰推送3.3.4for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)密碼修改在運(yùn)維工作中,為節(jié)省人力、物力資源,就要實(shí)現(xiàn)什么都不要交互,for循環(huán)實(shí)現(xiàn)不登錄遠(yuǎn)程主機(jī)批量修改密碼,原理是遠(yuǎn)程連接到對(duì)方一臺(tái)機(jī)器,在對(duì)方機(jī)器上執(zhí)行改密碼的命令。具體如下所示。3.3expect交互式公鑰推送for循環(huán)批量修改主機(jī)密碼的腳本案例詳情參考教材33.4節(jié)。3.3.4for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)密碼修改驗(yàn)證執(zhí)行腳本如下。3.3expect交互式公鑰推送3.3.4for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)密碼修改接下來(lái)看一下ok和fail文本文件。3.3expect交互式公鑰推送再次驗(yàn)證修改密碼是否成功,其方法是打開虛擬機(jī)用修改的密碼重新登錄一下即可。3.3.4for循環(huán)語(yǔ)句實(shí)現(xiàn)批量主機(jī)密碼修改然后任意打開一個(gè)主機(jī),如說(shuō)CentOS7u3-2用密碼666登錄。3.3expect交互式公鑰推送3.3.5for循環(huán)語(yǔ)句實(shí)現(xiàn)批量遠(yuǎn)程主機(jī)SSH配置LinuxShell使用SSH遠(yuǎn)程登錄到Linux服務(wù)器,讀取配置文件,并遠(yuǎn)程批量修改配置文件的用法。for循環(huán)語(yǔ)句實(shí)現(xiàn)批量遠(yuǎn)程主機(jī)SSH配置。具體案例詳情參考教材3.3.5節(jié)。3.3expect交互式公鑰推送3.4while循環(huán)和until循環(huán)3.4.1
while循環(huán)語(yǔ)句語(yǔ)法結(jié)構(gòu)返回目錄3.4.2until循環(huán)語(yǔ)句語(yǔ)法結(jié)構(gòu)3.4while循環(huán)和until循環(huán)while循環(huán)語(yǔ)句主要用來(lái)重復(fù)執(zhí)行一組命令或語(yǔ)句,常用于守護(hù)進(jìn)程或持續(xù)運(yùn)行的程序,其中循環(huán)的次數(shù)即可以是固定的,也可以不固定。3.4while循環(huán)和until循環(huán)3.4.1while循環(huán)語(yǔ)句語(yǔ)法結(jié)構(gòu)while循環(huán)語(yǔ)句的基本語(yǔ)法為:while循環(huán)語(yǔ)句會(huì)對(duì)條件測(cè)試進(jìn)行判斷,如果條件測(cè)試成立時(shí),則執(zhí)行do和done之間的循環(huán)體,直到條件測(cè)試不成立才停止循環(huán)。 while循環(huán)執(zhí)行流程對(duì)應(yīng)的邏輯如圖所示。3.4while循環(huán)和until循環(huán)3.4.2until循環(huán)語(yǔ)句語(yǔ)法結(jié)構(gòu)until循環(huán)語(yǔ)句基本語(yǔ)法為:until循環(huán)語(yǔ)句的用法與while循環(huán)語(yǔ)句的用法恰恰相反,until循環(huán)語(yǔ)句是在條件表達(dá)式不成立時(shí),進(jìn)入循環(huán)體執(zhí)行指令,條件表達(dá)式成立時(shí),終止循環(huán)。until的應(yīng)用場(chǎng)景很罕見。讀者只需了解即可。3.5循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5.1
while循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建返回目錄3.5.2while循環(huán)語(yǔ)句和until循環(huán)語(yǔ)句測(cè)試遠(yuǎn)程主機(jī)連接3.5.3
for、while、until終極對(duì)決3.5循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5.1while循環(huán)語(yǔ)句實(shí)現(xiàn)批量用戶創(chuàng)建批量創(chuàng)建用戶除了for循環(huán)語(yǔ)句可以實(shí)現(xiàn)外,while循環(huán)語(yǔ)句也可以實(shí)現(xiàn),接下來(lái)演示while實(shí)現(xiàn)批量用戶創(chuàng)建的用法。具體案例詳情參考教材3.5.1節(jié)。3.5循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5.2while循環(huán)語(yǔ)句和until循環(huán)語(yǔ)句測(cè)試遠(yuǎn)程主機(jī)連接接下來(lái)演示while測(cè)試遠(yuǎn)程主機(jī)連接的腳本用法,具體如下所示。while測(cè)試遠(yuǎn)程主機(jī)連接腳本。這個(gè)while測(cè)試主機(jī)連接案例,表示的是while循環(huán)條件判斷是否為真,如果為真則一直循環(huán),否則停止循環(huán)。其執(zhí)行結(jié)果如下:3.5循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5.2while循環(huán)語(yǔ)句和until循環(huán)語(yǔ)句測(cè)試遠(yuǎn)程主機(jī)連接而until循環(huán)剛好和while相反,條件判斷為假,就一直循環(huán),接下來(lái)演示until測(cè)試遠(yuǎn)程主機(jī)連接的腳本用法,具體如下所示。until測(cè)試遠(yuǎn)程主機(jī)連接腳本。until一直ping,ping不通繼續(xù)ping,ping通退出循環(huán)。其執(zhí)行結(jié)果如下:3.5循環(huán)語(yǔ)句案例實(shí)戰(zhàn)3.5.3for、while、until終極對(duì)決while和until均可采用類似for循環(huán)的語(yǔ)法格式,但while比較擅長(zhǎng)逐行處理文件。接下來(lái)分別用for、while和until寫個(gè)ping通主機(jī)的腳本,看一下實(shí)驗(yàn)效果。for循環(huán)寫的ping腳本。具體案例詳情參考教材3.5.3節(jié)。while循環(huán)寫的ping腳本。具體案例詳情參考教材3.5.3節(jié)。until循環(huán)寫的ping腳本。具體案例詳情參考教材3.5.3節(jié)。通過(guò)以上三個(gè)腳本可以看出,for循環(huán)用于循環(huán)次數(shù)固定的情形,常常用于正常的循環(huán)處理中。while循環(huán)的特長(zhǎng)是執(zhí)行守護(hù)進(jìn)程,以及實(shí)現(xiàn)循環(huán)持續(xù)執(zhí)行不退出的應(yīng)用,適用于頻率小于1分鐘的循環(huán)處理。而until循環(huán)用于只要條件測(cè)試語(yǔ)句為假時(shí),執(zhí)行語(yǔ)句塊,如果一開始條件測(cè)試語(yǔ)句就為真,則一次也不執(zhí)行語(yǔ)句塊,與C語(yǔ)言中的do…while不同。3.6Shell的并發(fā)控制3.6.1
for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制返回目錄3.6.2for后臺(tái)循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制3.6Shell的并發(fā)控制默認(rèn)情況下,Shell命令是串行方式自上而下執(zhí)行的,但如果有大批的命令需要執(zhí)行,串行就會(huì)浪費(fèi)大量的時(shí)間,這時(shí)就需要Shell并發(fā)執(zhí)行了。Shell并發(fā)控制有多種方法,本書介紹三種方法,分別為for循環(huán)實(shí)現(xiàn)、for循環(huán)放在后臺(tái)執(zhí)行和Linux管道實(shí)現(xiàn)高并發(fā),三種方法在企業(yè)場(chǎng)景中會(huì)經(jīng)常使用,都是極為常見的技術(shù)要點(diǎn)。前兩者比較淺顯易懂,本節(jié)介紹其基本語(yǔ)法,第三種Linux管道實(shí)現(xiàn)Shell高并發(fā)控制,在3.7節(jié)案例實(shí)戰(zhàn)中詳細(xì)講解。3.6Shell的并發(fā)控制3.6.1for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制基本語(yǔ)法為:3.6Shell的并發(fā)控制3.6.2for后臺(tái)循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制for后臺(tái)循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制基本語(yǔ)法為:3.7Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.1
for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)返回目錄3.7.2for后臺(tái)循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.3Linux管道實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.1for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)在企業(yè)生產(chǎn)環(huán)境中,會(huì)遇到到這樣的需求:要實(shí)現(xiàn)并發(fā)檢測(cè)數(shù)千臺(tái)服務(wù)器狀態(tài),第一種方法用for循環(huán)實(shí)現(xiàn),一個(gè)for循環(huán)1000次,順序執(zhí)行1000次任務(wù)。接下來(lái)演示for循環(huán)檢測(cè)服務(wù)狀態(tài)用法,具體如下所示。for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制。3.7Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.1for循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)由此可以看出,一個(gè)for循環(huán)1000次相當(dāng)于需要處理1000個(gè)任務(wù),循環(huán)體用sleep1代表運(yùn)行一條命令需要的時(shí)間,用success$i來(lái)標(biāo)示每條任務(wù),如果每條命令的運(yùn)行時(shí)間是1秒,那么1000條命令的運(yùn)行時(shí)間是1000秒,效率相當(dāng)?shù)停?000條命令都是順序執(zhí)行的,完全是阻塞式的運(yùn)行。假如有1000臺(tái)服務(wù)器,其中第900臺(tái)服務(wù)器宕機(jī)了,檢測(cè)到這臺(tái)機(jī)器狀態(tài)所需要的時(shí)間就是900s,后面就不會(huì)執(zhí)行了。因此要做到高并發(fā)執(zhí)行循環(huán)。3.7Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.2for后臺(tái)循環(huán)實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)第二種也采用for循環(huán),只不過(guò)把for循環(huán)放在后臺(tái)執(zhí)行,一個(gè)for循環(huán)1000次,循環(huán)體里面的每個(gè)任務(wù)都放入后臺(tái)執(zhí)行(在命令后面加&符號(hào)代表后臺(tái)執(zhí)行)。接下來(lái)演示for后臺(tái)循環(huán)檢測(cè)服務(wù)器的狀態(tài),具體如下所示。for后臺(tái)循環(huán)實(shí)現(xiàn)Shell并發(fā)控制。具體案例詳情參考教材3.7.2節(jié)。3.7Shell的并發(fā)控制案例實(shí)戰(zhàn)3.7.3Linux管道實(shí)現(xiàn)Shell的并發(fā)控制案例實(shí)戰(zhàn)第三種讀者需要重點(diǎn)掌握,使用Linux管道文件特性制作隊(duì)列,可以控制并發(fā)數(shù)量。管道分為有名管道和無(wú)名管道。創(chuàng)建有名管道文件命令是mkfifo,一般,無(wú)名管道是用得最多的。接下來(lái)演示Linux管道實(shí)現(xiàn)Shell并發(fā)的用法,具體案例詳情參考教材3.7.3節(jié)。這一章主要對(duì)Shell中for循環(huán)、while循環(huán)和until循環(huán)的講解,以及每種循環(huán)在企業(yè)中的使用場(chǎng)景和實(shí)戰(zhàn)舉例,讀者應(yīng)掌握f(shuō)or循環(huán)和while循環(huán),util循環(huán)了解即可,在不同的場(chǎng)合使用不同的循環(huán),根據(jù)不同的需求結(jié)合條件測(cè)試能夠準(zhǔn)確快速地寫出Shell腳本。本章小結(jié)第4章Shell數(shù)組
Shell數(shù)組的基本概念Shell數(shù)組的類型Shell數(shù)組的定義Shell數(shù)組的遍歷及賦值Shell數(shù)組腳本實(shí)戰(zhàn)Shell數(shù)組的基本概念4.1Shell數(shù)組的類型4.2?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell數(shù)組的定義4.3Shell數(shù)組的遍歷及賦值4.4?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)Shell數(shù)組腳本實(shí)戰(zhàn)4.5?點(diǎn)擊查看本小節(jié)知識(shí)架構(gòu)學(xué)習(xí)目標(biāo)掌握掌握熟悉了解掌握數(shù)組的基本概念1熟悉數(shù)組編寫腳本程序42掌握數(shù)組的定義用法3了解數(shù)組的賦值用法數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),是相同數(shù)據(jù)類型的元素按一定順序排列的元素集合。數(shù)組實(shí)際上就是一連串類型相同的變量,這些變量用數(shù)組名命名,并用索引互相區(qū)分。使用數(shù)組時(shí),可以通過(guò)索引來(lái)訪問(wèn)數(shù)組元素,如數(shù)組元素的賦值和取值。4.1Shell數(shù)組的基本概念數(shù)組中有限個(gè)相同類型的變量用一個(gè)名字命名,然后用編號(hào)區(qū)分它們。用于區(qū)分不同元素的編號(hào)稱為數(shù)組下標(biāo)。數(shù)組的元素有時(shí)也稱為下標(biāo)變量。4.2Shell數(shù)組的類型4.2.1普通數(shù)組返回目錄4.2.2關(guān)聯(lián)數(shù)組4.2.3定義數(shù)組的類型4.2Shell數(shù)組的類型數(shù)組分為普通數(shù)組和關(guān)聯(lián)數(shù)組,普通數(shù)組中的索引(下標(biāo))都是整數(shù),關(guān)聯(lián)數(shù)組的數(shù)組索引可以用任意的文本。關(guān)聯(lián)數(shù)組使用之前需要聲明,關(guān)聯(lián)數(shù)組與普通數(shù)組最大的區(qū)別是,它是由特定格式的鍵值對(duì)組成。接下來(lái)針對(duì)這兩種數(shù)組類型分別進(jìn)行講解。4.2.1普通數(shù)組普通數(shù)組中:數(shù)組元素的索引(下標(biāo))從0開始編號(hào),獲取數(shù)組中的元素要利用索引(下標(biāo))。索引(下標(biāo))可以是算術(shù)表達(dá)式,其結(jié)果必須是一個(gè)整數(shù)。普通數(shù)組定義。4.2Shell數(shù)組的類型4.2.2關(guān)聯(lián)數(shù)組關(guān)聯(lián)數(shù)組和普通數(shù)組所不同的是,它的索引下標(biāo)可以是任意的整數(shù)和字符串。關(guān)聯(lián)數(shù)組定義。4.2Shell數(shù)組的類型4.2.3定義數(shù)組的類型在LinuxShell中,數(shù)組分為普通數(shù)組和關(guān)聯(lián)數(shù)組。用戶定義的是普通數(shù)組,如需使用關(guān)聯(lián)數(shù)組需要先聲明再使用。用戶聲明關(guān)聯(lián)數(shù)組使用-A參數(shù)。通常情況下Shell解釋器隱式聲明普通數(shù)組,用戶無(wú)須操作。若用戶需顯式聲明普通數(shù)組,需要使用-a參數(shù)。聲明普通數(shù)組的方法為:4.2Shell數(shù)組的類型聲明關(guān)聯(lián)數(shù)組的方法為:4.3Shell數(shù)組的定義4.3.1直接定義數(shù)組返回目錄4.3.2下標(biāo)定義數(shù)組4.3.3間接定義數(shù)組4.3.4從文件中讀入定義數(shù)組4.3Shell數(shù)組的定義在LinuxShell中,定義一個(gè)數(shù)組有多種方法,需要先按照命令規(guī)則給數(shù)組命名,然后再定義數(shù)組的值。數(shù)組的定義方法有直接定義數(shù)組、下標(biāo)定義數(shù)組、間接定義數(shù)組和從文件中讀入定義數(shù)組,接下來(lái)詳細(xì)介紹定義數(shù)組的方法。4.3.1直接定義數(shù)組直接定義數(shù)組是用小括號(hào)將變量值括起來(lái)賦值給數(shù)組變量,每個(gè)變量值之間要用空隔進(jìn)行分隔。直接定義數(shù)組格式為。這種方法是最常用的方法,需要重點(diǎn)掌握。具體示例如下。直接定義數(shù)組。4.3Shell數(shù)組的定義4.3.2下標(biāo)定義數(shù)組下標(biāo)定義數(shù)組是用小括號(hào)將變量值括起來(lái),同時(shí)采用鍵值對(duì)的形式賦值。下標(biāo)定義數(shù)組格式為:此種方法為key-value鍵值對(duì)的形式,小括號(hào)里對(duì)應(yīng)的數(shù)字為數(shù)組下標(biāo),等號(hào)后面的內(nèi)容為下標(biāo)對(duì)應(yīng)的數(shù)組變量的值。帶有下標(biāo)定義數(shù)組。4.3Shell數(shù)組的定義4.3.3間接定義數(shù)組間接定義數(shù)組是分別通過(guò)定義數(shù)組的方法來(lái)定義。其語(yǔ)法格式為:此種方法要求一次賦一個(gè)值,比較復(fù)雜。具體如下所示。間接定義數(shù)組。4.3Shell數(shù)組的定義4.3.4從文件中讀
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《外國(guó)檔案管理》課件
- 肇慶醫(yī)學(xué)高等??茖W(xué)?!墩衅概c面試技巧》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024有房產(chǎn)離婚協(xié)議范本及財(cái)產(chǎn)保密協(xié)議3篇
- 高科技窗簾知識(shí)培訓(xùn)課件
- 農(nóng)民農(nóng)藥知識(shí)培訓(xùn)課件
- 網(wǎng)絡(luò)游戲銷售工作總結(jié)
- 倉(cāng)鼠養(yǎng)鼠知識(shí)培訓(xùn)課件
- 2024年行政流程優(yōu)化協(xié)議3篇
- 舞蹈演藝場(chǎng)所衛(wèi)生規(guī)范
- 環(huán)保行業(yè)工程師工作心得分享
- 醫(yī)藥銷售合規(guī)培訓(xùn)
- 法理學(xué)課件馬工程
- 《玉米種植技術(shù)》課件
- DB51-T 5038-2018 四川省地面工程施工工藝標(biāo)準(zhǔn)
- 第47屆世界技能大賽江蘇省選拔賽計(jì)算機(jī)軟件測(cè)試項(xiàng)目技術(shù)工作文件
- 2023年湖北省公務(wù)員錄用考試《行測(cè)》答案解析
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
- 2024年廣東省深圳市中考英語(yǔ)試題含解析
- M200a電路分析(電源、藍(lán)牙、FM)
- 2024-2030年全球及中國(guó)洞察引擎行業(yè)市場(chǎng)現(xiàn)狀供需分析及市場(chǎng)深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 建筑工程施工圖設(shè)計(jì)文件審查辦法
評(píng)論
0/150
提交評(píng)論