shell腳本常用的4種流程控制語句

if條件測試語句

if條件測試語句可以讓腳本根據實際情況自動執行相應的命令。從技術角度來講,if語句分爲單分支結構、雙分支結構、多分支結構;其複雜度隨着靈活度一起逐級上升。
1.if條件語句的單分支結構由if、then、fi關鍵詞組成,而且只在條件成立後才執行預設的命令,相當於口語的“如果……那麼……”。單分支的if語句屬於最簡單的一種條件判斷結構。
shell腳本常用的4種流程控制語句
下面使用單分支的if條件語句來判斷/media/cdrom文件是否存在,若存在就結束條件判斷和整個Shell腳本,反之則去創建這個目錄:
shell腳本常用的4種流程控制語句
2.if條件語句的雙分支結構由if、then、else、fi關鍵詞組成,它進行一次條件匹配判斷,如果與條件匹配,則去執行相應的預設命令;反之則去執行不匹配時的預設命令,相當於口語的“如果……那麼……或者……那麼……”。if條件語句的雙分支結構也是一種很簡單的判斷結構。
shell腳本常用的4種流程控制語句
例:使用雙分支的if條件語句來驗證某臺主機是否在線,然後根據返回值的結果,要麼顯示主機在線信息,要麼顯示主機不在線信息。這裏的腳本主要使用ping命令來測試與對方主機的網絡聯通性,而Linux系統中的ping命令不像Windows一樣嘗試4次就結束,因此爲了避免用戶等待時間過長,需要通過-c參數來規定嘗試的次數,並使用-i參數定義每個數據包的發送間隔,以及使用-W參數定義等待超時時間。
shell腳本常用的4種流程控制語句
驗證:
shell腳本常用的4種流程控制語句
3.if條件語句的多分支結構由if、then、else、elif、fi關鍵詞組成,它進行多次條件匹配判斷,這多次判斷中的任何一項在匹配成功後都會執行相應的預設命令,相當於口語的“如果……那麼……如果……那麼……”。if條件語句的多分支結構是工作中最常使用的一種條件判斷結構,儘管相對複雜但是更加靈活。
shell腳本常用的4種流程控制語句
例:使用多分支的if條件語句來判斷用戶輸入的分數在哪個成績區間內,然後輸出如Excellent、Pass、Fail等提示信息。在Linux系統中,read是用來讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給後面的指定變量,-p參數用於向用戶顯示一定的提示信息。在下面的腳本示例中,只有當用戶輸入的分數大於等於85分且小於等於100分,才輸出Excellent字樣;若分數不滿足該條件(即匹配不成功),則繼續判斷分數是否大於等於70分且小於等於84分,如果是,則輸出Pass字樣;若兩次都落空(即兩次的匹配操作都失敗了),則輸出Fail字樣
shell腳本常用的4種流程控制語句
爲什麼輸入的分數爲200時,依然顯示Fail呢?原因很簡單—沒有成功匹配腳本中的兩個條件判斷語句,因此自動執行了最終的兜底策略。可見,這個腳本還不是很完美,建議讀者自行完善這個腳本,使得用戶在輸入大於100或小於0的分數時,給予Error報錯字樣的提示。

for條件循環語句

for循環語句允許腳本一次性讀取多個信息,然後逐一對信息進行操作處理,當要處理的數據有範圍時,使用for循環語句再適合不過了。
shell腳本常用的4種流程控制語句
下面使用for循環語句從列表文件中讀取多個用戶名,然後爲其逐一創建用戶賬戶並設置密碼。首先創建用戶名稱的列表文件users.txt,每個用戶名稱單獨一行。讀者可以自行決定具體的用戶名稱和個數:
shell腳本常用的4種流程控制語句
接下來編寫Shell腳本Example.sh。在腳本中使用read命令讀取用戶輸入的密碼值,然後賦值給PASSWD變量,並通過-p參數向用戶顯示一段提示信息,告訴用戶正在輸入的內容即將作爲賬戶密碼。在執行該腳本後,會自動使用從列表文件users.txt中獲取到所有的用戶名稱,然後逐一使用“id 用戶名”命令查看用戶的信息,並使用$?判斷這條命令是否執行成功,也就是判斷該用戶是否已經存在。

需要多說一句,/dev/null是一個被稱作Linux黑洞的文件,把輸出信息重定向到這個文件等同於刪除數據(類似於沒有回收功能的垃圾箱),可以讓用戶的屏幕窗口保持簡潔。
shell腳本常用的4種流程控制語句
執行批量創建用戶的Shell腳本Example.sh,在輸入爲賬戶設定的密碼後將由腳本自動檢查並創建這些賬戶。由於已經將多餘的信息通過輸出重定向符轉移到了/dev/null黑洞文件中,因此在正常情況下屏幕窗口除了“用戶賬戶創建成功”(Create success)的提示後不會有其他內容。
在Linux系統中,/etc/passwd是用來保存用戶賬戶信息的文件。如果想確認這個腳本是否成功創建了用戶賬戶,可以打開這個文件,看其中是否有這些新創建的用戶信息。
shell腳本常用的4種流程控制語句
您還記得在學習雙分支if條件語句時,用到的那個測試主機是否在線的腳本麼?既然我們現在已經掌握了for循環語句,不妨做些更酷的事情,比如嘗試讓腳本從文本中自動讀取主機列表,然後自動逐個測試這些主機是否在線。
首先創建一個主機列表文件ipadds.txt:
shell腳本常用的4種流程控制語句
然後前面的雙分支if條件語句與for循環語句相結合,讓腳本從主機列表文件ipadds.txt中自動讀取IP地址(用來表示主機)並將其賦值給HLIST變量,從而通過判斷ping命令執行後的返回值來逐個測試主機是否在線。腳本中出現的$(命令)是一種完全類似於第3章的轉義字符中反引號命令的Shell操作符,效果同樣是執行括號或雙引號括起來的字符串中的命令。大家在編寫腳本時,多學習幾種類似的新方法,可在工作中大顯身手:
shell腳本常用的4種流程控制語句

while條件循環語句

while條件循環語句是一種讓腳本根據某些條件來重複執行命令的語句,它的循環結構往往在執行前並不確定最終執行的次數,完全不同於for循環語句中有目標、有範圍的使用場景。while循環語句通過判斷條件測試的真假來決定是否繼續執行命令,若條件爲真就繼續執行,爲假就結束循環。
shell腳本常用的4種流程控制語句
接下來結合使用多分支的if條件測試語句與while條件循環語句,編寫一個用來猜測數值大小的腳本Guess.sh。該腳本使用$RANDOM變量來調取出一個隨機的數值(範圍爲0~32767),將這個隨機數對1000進行取餘操作,並使用expr命令取得其結果,再用這個數值與用戶通過read命令輸入的數值進行比較判斷。這個判斷語句分爲三種情況,分別是判斷用戶輸入的數值是等於、大於還是小於使用expr命令取得的數值。當前,現在這些內容不是重點,我們當前要關注的是while條件循環語句中的條件測試始終爲true,因此判斷語句會無限執行下去,直到用戶輸入的數值等於expr命令取得的數值後,這兩者相等之後才運行exit 0命令,終止腳本的執行。
shell腳本常用的4種流程控制語句

case條件測試語句

case語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;而如果數據不在所列出的範圍內,則會去執行星號(*)中所定義的默認命令。
shell腳本常用的4種流程控制語句
在前文介紹的Guess.sh腳本中有一個致命的弱點—只能接受數字!您可以嘗試輸入一個字母,會發現腳本立即就崩潰了。原因是字母無法與數字進行大小比較,例如,“a是否大於等於3”這樣的命題是完全錯誤的。我們必須有一定的措施來判斷用戶的輸入內容,當用戶輸入的內容不是數字時,腳本能予以提示,從而免於崩潰。

通過在腳本中組合使用case條件測試語句和通配符(詳見第3章),完全可以滿足這裏的需求。接下來我們編寫腳本Checkkeys.sh,提示用戶輸入一個字符並將其賦值給變量KEY,然後根據變量KEY的值向用戶顯示其值是字母、數字還是其他字符。
shell腳本常用的4種流程控制語句

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章