bat脚本交互输入_Shell脚本的应用(一)
會不會有那么一天,生活可以簡單到每天清早踏上一輛載著鮮花的腳踏車,微笑著穿過窄窄的街巷,為愛花的人送去芬芳,為需要知識的你送去幫助。
簡介
????????隨著Linux系統在企業中的應用越來越多,服務器的自動化管理也變得越來越重要。在Linux服務器的自動化維護工作中,除了計劃任務的設置以外,Shell腳本的應用也是非常重要的一部分。
????????本章將主要學習Shell腳本基礎,變量使用等知識,要求學會編寫簡單的腳本。
本章重點
Shell變量的應用
Shel腳本的編寫和執行
????????????????????????????????????????????理論講解
一,Shell腳本基礎
????????在一些復雜的Linux維護工作中,大量重復性的輸入和交互操作不僅費時費力,而且容易出錯。
????????而編寫一個恰到好處的Shell腳本程序,可以批量處理,自動化地完成一系列維護任務,大大減輕管理員的負擔。
1.編制第一個Shell腳本
??????? Linux系統中的Shell腳本是一個特殊的應用程序,它介于操作系統內核與用戶之間,充當了一個“命令解釋器”的角色,負責接收用戶輸入的操作指令(命令)并進行解釋,將需要執行的操作傳遞給內核執行,并輸出執行結果。
常見的Shell 解釋器程序有很多種,使用不同的Shell 腳本時,其內部指令、命令行提示等方面會存在一些區別.通過/etc/shells文件可以了解當前系統所支持的Shell腳本種類。
????????其中,/bin/bash是目前大多數Linux版本采用的默認Shell腳本.Bash的全稱為Bourne Again Shell.是受歡迎的開源軟件項目之一。本課程中講述的所有Shell操作均以Bash為例。
????????那么,什么是“Shell腳本”呢?簡單地說,只要將平時使用的各種Linux命令按順序保存到一個文本文件中,然后添加可執行權限,這個文件就成為一個Shell腳本了。例如,執行以下操作可以創建第一個腳本文件:helloShell.sh。
????????當然,一個合格的Shell腳本程序應該遵循標準的腳本結構,而且能夠輸出友好的提示信息,更加容易讀懂.對于代碼較多,結構復雜的腳本,應添加必要的注釋文字,標準化的helloShell.sh腳本內容如下所示。
helloShell.sh腳本內容
執行helloShell.sh腳本內容
????????上述helloShell.sh腳本文件中,包括三條命令:cd/etc/、pwd、Is。執行此腳本文件后。
????????輸出結果與依次單獨執行這三條命令是相同的,從而實現了“批量處理”的自動化過程。
上述helloShell.sh腳本文件中
????????第一行#!/bin/bash 是一行特殊的腳本聲明,表示此行以后的語句通過/bin/bash程序來解釋執行;
????????第二行#大多用來解釋當前腳本的作用以及功能
????????第三行#寫編寫腳本工程師的聯系方式,方便腳本故障后聯系該工程師
????????echo命令用于輸出字符串,以使腳本的輸出信息更容易讀懂.
????1)執行腳本的方法
????????????sh helloShell.sh:?不需要添加執行權限來執行腳本,可以直接執行腳本,相當于/bin/sh來解釋腳本。
????????????source helloShell.sh: 和/bin/sh一樣,不需要添加執行權限,但是source和/bin/sh的區別是執行完指定腳本會進入該腳本的變量目錄
????????????? ?./helloShell.sh:需要添加執行權限來解釋腳本
??????? Linux系統中包括大量的Shell腳本文件,在學習Shell腳本的過程中可用來作為參考,但應盡量避免直接修改系統內的Shell腳本文件,以免導致服務或系統故障。
二,重定向與管道操作
????????由于Shell 腳本“批量處理”的特殊性,其大部分操作過程以靜默方式運行,不需要用戶進行干預。因此學會提取、過濾執行信息變得十分重要。本小節主要介紹Shell環境中的兩個I/O操作:重定向、管道。
1.重定向操作
??????? Linux系統使用文件來描述各種硬件,設備等資源,如以前學過的硬盤和分區,光盤等設備文件。
用戶通過操作系統處理信息的過程中,包括以下幾類交互設備文件。
標準輸入(STDN):默認的設備是鍵盤,文件編號為0,命令將從標準輸入文件中讀取在執行過程中需要的輸入數據。用“
標準輸出(STDOUT):默認的設備是顯示器,文件編號為1.命令將執行后的輸出結果發送到標準輸出文件。用“>”表示。
標準錯誤(STDERR):默認的設備是顯示器,文件編號為2,命令將執行期間的各種錯誤信息發送到標準錯誤文件。用“2>”表示。
????????標準輸入、標準輸出和標準錯誤默認使用鍵盤和顯示器作為關聯的設備,與操作系統進行交互,完成最基本的輸入、輸出操作,即從鍵盤接收用戶輸入的各種命令字串、輔助控制信息,并將命令結果輸出到屏幕上;如果命令執行出錯,也會將錯誤信息反饋到屏幕上。
????????在實際的Linux系統維護中,可以改變輸入、輸出內容的方向,而不使用默認的標準輸入、輸出設備(鍵盤和顯示器),這種操作稱為重定向。
1)重定向輸出
????????重定向輸出指的是將命令的正常輸出結果保存到指定的文件中,而不是直接顯示在顯示器的屏幕上。重定向輸出使用“>”或“>>”操作符號,分別用于覆蓋或追加文件。
????????若重定向輸出的目標文件不存在,則會新建該文件,然后將前面命令的輸出結果保存到該文件中;若目標文件已經存在,則將輸出結果覆蓋或追加到文件中。例如,若要將當前主機的CPU類型信息(uname-p)保存到1.txt文件中,而不是直接顯示在屏幕上,可以執行以下操作。
????????當需要保留目標文件原有的內容時,應改用‘‘>>”操作符號,以便追加內容而不是全部覆蓋。
例如,執行以下操作可以將內核版本信息追加到kernel.txt文件中。
2)重定向輸入
????????重定向輸入指的是將命令中接收輸入的途徑由默認的鍵盤改為指定的文件,而不是等待從鍵盤輸入。重定向輸入使用
????????通過重定向輸入可以使一些交互式操作過程能夠通過讀取文件來完成。例如,使用passwd命令為用戶設置密碼時,每次都必須根據提示輸入兩次密碼字串,非常煩瑣,若改用重定向輸入將可以省略交互式的過程,而自動完成密碼設置(結合passwd命令的--stdin’選項來識別標準輸入)。
????????沒有交互式的操作語句更方便在Shell腳本程序中使用,可以大大減少程序被打斷的過程,提高腳本執行的效率。
3)錯誤重定向
????????錯誤重定向指的是將執行命令過程中出現的錯誤信息(如選項或參數錯誤等)保存到指定的文件,而不是直接顯示在屏幕上。錯誤重定向使用“2>操作符,其中“2是指錯誤文件的編號(在使用標準輸出.標準輸入重定向時,實際上省略了1.0編號)。
????????在實際應用中,錯誤重定向可用來收集程序執行的錯誤信息,為排錯提供依據,對于Shell腳本,還可以將無關緊要的錯誤信息重定向到空文件/dev/null中,以保持腳本輸出的簡潔。例如,執行以下操作可以將使用tar命令進行備份時出現的錯誤信息保存到error.log文件中。
????????使用“2>操作符時,會像使用>操作符一樣覆蓋目標文件的內容,若要追加內容而不是覆蓋文件,則應改用“2>>操作符。
????????當命令輸出的結果可能既包括標準輸出(正常執行)信息,又包括錯誤輸出信息時,可以使用操作符“>”“2>”將兩類輸出信息分別保存到不同的文件,也可以使用“&>操作符將兩類輸出信息保存到同一個文件。例如,在編譯源碼包的自動化腳本中,若要忽略make,make install等操作過程信息,則可以將其定向到空文件/dev/null. 這里就不在多做演示。
2.管道操作
????????管道(pipe)操作為不同命令之間的協同工作提供了一種機制。位于管道符號左側的命令輸出的結果,將作為右側命令的輸入(處理對象),同一行命令中可以使用多個管道。
????????在Shell腳本應用中,管道操作通常用來過濾所需要的關鍵信息,例如,使用grep命令查詢使用
????????/bin/bash作為Shell的用戶名稱時,會輸出符合條件的整行內容,在此基礎上可以結合管道操作與awk命令做進一步過濾,只輸出用戶名和登錄Shell列。
提取前:
提取后:
????????上例中awk命令的作用是以冒號:“作為分隔,輸出第1個、第7個區域的字
????????其中的“-F”部分用來指定分隔符號(未指定時,默認以空格或制表符分隔)。關于awk命令的更多用法,在后面的章節中再做詳細介紹,本章不做過多講解。
????????又如,若要提取根分區(/)的磁盤使用率信息,可以執行以下操作,其中用到了df、grep.awk命令和管道操作。
提取前:
提取后:
????????重定向與管道操作是Shell環境中十分常用的功能,若能夠熟練掌握并靈活運用,將有助于編寫代碼簡潔但功能強大的Shell腳本程序。
三,使用Shell變量
????????各種Shell環境中都使用到了“變量”的概念.Shell變量用來存放系統和用戶需要使用的特定參數(值).而且這些參數可以根據用戶的設定或系統環境的變化而相應變化。通過使用變量,Shell程序能夠提供更加靈活的功能,適應性更強。
????????常見Shell 變量的類型包括自定義變量、環境變量,位置變量、預定義變量。本節將分別介紹這四種Shell變量的使用。
1.自定義變量
????????自定義變量是由系統用戶自己定義的變量,只在用戶自己的Shell環境中有效,因此又稱為本地變量。在編寫Shell 腳本程序時,通常會設置一些特定的自定義變量,以適應程序執行過程中的各種變化,滿足不同的需要。
1)定義新的變量
??????? Bash中的變量操作相對比較簡單,不像其他高級編程語言(如C/C++、Java等)那么復雜。
????????在定義一個新的變量時,一般不需要提前進行聲明,而是直接指定變量名稱并賦給初始值(內容)即可。
????????定義變量的基本格式為“變量名=變量值”,等號兩邊沒有空格,變量名稱需以字母或下劃線開頭,名稱中不要包含特殊字符(如+、一、*、/.7.%.&、#等)。例如,若要定義一個名為name"的變量(值為CentOS)和一個名為“Version”的變量(值為2.7.13),可以執行以下操作。
2.查看和引用變量的值
????????通過在變量名稱前添加前導符號“$”,可以引用一個變量的值。使用echo命令可以查看變量,可以在一條echo命令中同時查看多個變量值。
????????當變量名稱容易和緊跟其后的其他字符相混淆時,需要添加大括號"{}"將其括起來,否則將無法確定正確的變量名稱。對于未定義的變量,將顯示為空值。
3.變量賦值的特殊操作
????????在等號=后邊直接指定變量內容是為變量賦值的最基本方法,除此之外,還有一些特殊的賦值操作,可以更靈活地為變量賦值,以便適用于各種復雜的管理任務。
1)雙引號(")
????????雙引號主要起界定字符串的作用,特別是當要賦值的內容中包含空格時,必須以雙引號括起來:
其他情況下雙引號通常可以省略。例如,若要將Python 2.7.13賦值給變量PYTHON,應執行PYTHON=“Python 2.7.13”操作。
加"之前
加"之后
????????在雙引號范圍內,使用“$”符號可以引用其他變量的值(變量引用),從而能夠直接調用現有變量的值來賦給新的變量,例如,執行以下操作可以調用變量Version的值,將其賦給一個新的變量sqlserver,最終的值為“SOLServer 2.7.13”.
2)單引號(')
????????當要賦值的內容中包含$、\等具有特殊含義的字符時,應使用單引號括起來。在單引號的范圍內,將無法引用其他變量的值,任何字符均作為普通字符看待。但賦值內容中包含單引號時。需使用\符號進行轉義,以免沖突。
3)反撇號(`)
????????反撇號主要用于命令替換,允許將執行某個命令的屏幕輸出結果賦值給變量。反撇號括起來的范圍內必須是能夠執行的命令行,否則將會出錯.例如,若要在一行命令中查找useradd命令程序的位置并列出其詳細屬性,可以執行以下操作。
????????上述操作相當于連續執行了兩條命令——先通過which useradd 命令查找出useradd命令的程序位置,然后根據查找結果列出文件屬性。執行過程中,會用which useradd命令的輸出結果替換整個反撇號范圍。
又若,我們創建一個名為alice的用戶,并為其設置密碼,用一行命令完成,可以如圖所示:
????????需要注意的是,使用反撇號難以在一行命令中實現嵌套命令替換操作,這時可以改用“$()來代替反撇號操作,以解決嵌套的問題。例如,若要查詢提供useradd命令程序的軟件包所安裝的配置文件位置,可以執行以下操作(從里到外先后執行替換)。
4)read命令
????????除了上述賦值操作以外,還可以使用Bash的內置命令read來給變量賦值。read命令用來提示用戶輸入信息,從而實現簡單的交互過程。執行時將從標準輸入設備(鍵盤)讀入一行內容,并以空格為分隔符,將讀入的各字段依次賦值給指定的變量(多余的內容賦值給最后一個變量)。若指定的變量只有一個,則將整行內容賦值給此變量。
????????為了使交互式操作的界面更加友好,提高易用性,read命令可以結合“一p選項來設置提示信息,以便告知用戶應該輸入什么內容等相關事項。例如,若希望提示用戶輸入備份文件的存放目錄,并將輸入的路徑信息賦值給變量beifen1和beifen2,可以執行以下操作。
4.設置變量的作用范圍
?????????默認情況下,新定義的變量只在當前的Shell環境中有效,因此稱為局部變量。當進入子程序或新的子Shell環境時,局部變量將無法再使用。例如,直接執行Bash進入一個新的子Shell 腳本后。
將無法引用父級Shell環境中定義的name等變量。
????????為了使用戶定義的變量在所有的子Shell環境中能夠繼續使用,減少重復設置工作,可以通過內部命令export將指定的變量導出為全局變量。用戶可以同時指定多個變量名稱作為參數(無須使用5”符號),變量名之間以空格分隔。
5.數值變量的運算
??????? Shell變量的數值運算多用于腳本程序的過程控制(如循環次數.使用量比較等,后續章節會介紹)。在Bash Shell環境中,只能進行簡單的整數運算,不支持小數運算。整數值的運算主要通過內部命令expr進行,基本格式如下所示。需要注意,運算符與變量之間必須有至少一個空格。
expr? 變量1? ?運算符? 變量2? 運算符? ?變量3…
其中,變量1、變量2……對應為需要計算的數值變量(需要以“$符號調用),常用的幾種運算符如下所述
+:加法運算。
一:減法運算。
\*:乘法運算。注意不能僅使用*”符號,否則將被當成文件通配符。
/:除法運算。
%:求余運算,又稱為取余運算,用來計算數值相除后的余數。
以下操作設置了a,b兩個變量,并依次演示了變量a,b的加,減、乘,除、取模運算結果。
????????若要將運算結果賦值給其他變量,可以結合命令替換操作(使用反撇號)。例如,計算變量b的3次方,并將結果賦值給變量NUM.
5.特殊的Shell變量
????????除了用戶自行定義的Shell變量以外,在Linux系統和Bash Shell環境中還有一系列的特殊變量—環境變量、位置變量、預定義變量。下面分別進行介紹。
1)環境變量
????????環境變量指的是出于運行需要而由Linux系統提前創建的一類變量,主要用于設置用戶的工作環境,包括用戶宿主目錄,命令查找路徑、用戶當前目錄、登錄終端等。環境變量的值由Linux系統自動維護,會隨著用戶狀態的改變而改變。
????????使用env命令可以查看到當前工作環境下的環境變量,對于常見的一些環境變量應了解其各自的用途。例如,變量USER表示用戶名稱,HOME表示用戶的宿主目錄,LANG表示語言和字符集,PWD表示當前所在的工作目錄,PATH表示命令搜索路徑等。
??????? PATH變量用于設置可執行程序的默認搜索路徑,當僅指定文件名稱來執行命令程序時,Linux系統將在PATH變量指定的目錄范圍查找對應的可執行文件,如果找不到則會提示“command not found"。例如test.sh腳本位于/root目錄下,若希望能直接通過文件名稱來運行腳本,可以修改PATH變量以添加搜索路徑,或者將test.sh腳本復制到現有搜索路徑中的某個文件夾下。
2.位置變量
????????為了在使用Shell腳本程序時,方便通過命令行為程序提供操作參數,Bash引入了位置變量的概念.當執行命令行操作時,第一個字段表示命令名或腳本程序名,其余的字符串參數按照從左到右的順序依次賦值給位置變量。
位置變量也稱為位置參數,使用S1、s2、3.……s9表示。例如,當執行命令行‘1s ?-lh ?/boot/時,其中第1個位置變量為“一h”,以“s1”表示;第2個位置變量為“/boot/”,以s2”表示。
????????命令或腳本本身的名稱使用“$0”表示,雖然$0與位置變量的格式相同,但是$0屬于預定義變量而不是位置變量。
例如:
3.預定義變量
????????預定義變量是由Bash程序預先定義好的一類特殊變量,用戶只能使用預定義變量,而不能創建新的預定義變量,也不能直接為預定義變量賦值。預定義變量使用s”符號和另一個符號組合表示,較常用的幾個預定義變量的含義如下。
5#:表示命令行中位置參數的個數。
5*:表示所有位置參數的內容。
$?:表示前一條命令執行后的返回狀態,返回值為0表示執行正確,返回任何非0值均表示執行出現異常。關于52變量的使用將在下一章介紹。
$0;表示當前執行的腳本或程序的名稱。
? ?例如:
????????????????????????????????????????????????????實驗案例
編寫root登錄歡迎腳本,報告當前主機中的進程數,已登錄用戶數,根文件系統的磁盤使用率,顯示如需求所示
1)創建welcomeRoot.sh 并編輯
????????2)添加執行權限
????????3)修改/root/.bash_profile 每次登陸時加載/root/welcomeroot.sh腳本
????????4)測試,重啟計算機,使用root賬戶登錄
2.編寫start、stop、status 三個腳本程序,用來啟動、停止各種系統服務。例如,直接執行“stop crond"“start crond”命令即可停止、啟動crond服務。
????1)創建start腳本,進行編輯
??2)創建stop腳本,進行編輯
??3)創建status腳本,進行編輯
????4)在PATH變量中添加/root路徑,方便以腳本名字直接啟動,停止,查看服務運行狀態信息
5)為三個腳本添加執行權限
???6)測試,安裝Apache服務,用來測試
?????????? start:
????????????stop:
????????status:
?????????至此,實驗完成
故事很短,道理很長,學無止境,不忘初心,砥礪前行 ?
微信搜索 “徐阿馬” ?關注公眾號,把你們想知道的,想提的意見發給我,我會采納!期待你的關注!
總結
以上是生活随笔為你收集整理的bat脚本交互输入_Shell脚本的应用(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础——导入模块
- 下一篇: python逐行读取数据时出现错误_Py