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