1. 程式人生 > >Linux進階第八天

Linux進階第八天

內容 相對 復雜度 一行 lis 會有 ipad 技術 系統版本

shell腳本之流程控制語句

50.流程控制語句

接下來我們通過if、for、while、case這4種流程控制語句來學習編寫難度更大、功能更強的Shell腳本。
if條件測試語句可以讓腳本根據實際情況自動執行相應的命令。從技術角度來講,if語句分為單分支結構、雙分支結構、多分支結構;其復雜度隨著靈活度一起逐級上升。
if條件語句的單分支結構由if、then、fi關鍵詞組成,而且只在條件成立後才執行預設的命令,相當於口語的“如果……那麽……”。單分支的if語句屬於最簡單的一種條件判斷結構,語法格式:
if 條件測試操作
than 命令序列
fi

........................................................................................................................

if 目錄不存在
than 創建該目錄
fi
.............................................................................................................................
下面使用單分支的if條件語句來判斷/etc/lgm文件是否存在,若存在就結束條件判斷和整個Shell腳本,反之則去創建這個目錄:
編寫腳本為:
技術分享圖片
執行看看:
技術分享圖片
更改下腳本文件:
技術分享圖片
解釋下ping命令:
-c ping的次數,
-i 0.2間隔0.2秒
-w 最長延遲3秒
執行腳本:
技術分享圖片
這就是if的單分支結構:


if條件語句的雙分支結構由if、then、else、fi關鍵詞組成,它進行一次條件匹配判斷,如果與條件匹配,則去執行相應的預設命令;反之則去執行不匹配時的預設命令,相當於口語的“如果……那麽……或者……那麽……”。if條件語句的雙分支結構也是一種很簡單的判斷結構,

語法格式:


if 條件測試操作
then 命令序列1
else 命令序列2
fi


if 能夠ping通
then 提示服務器正常工作
else 報警服務器出現問題
fi


下面使用雙分支的if條件語句來驗證某臺主機是否在線,然後根據返回值的結果,要麽顯示主機在線信息,要麽顯示主機不在線信息。這裏的腳本主要使用ping命令來測試與對方主機的網絡聯通性,而Linux系統中的ping命令不像Windows一樣嘗試4次就結束,因此為了避免用戶等待時間過長,需要通過-c參數來規定嘗試的次數,並使用-i參數定義每個數據包的發送間隔,以及使用-W參數定義等待超時時間。
再次修改腳本:

技術分享圖片
$?的作用是顯示上一次命令的執行返回值

若前面的那條語句成功執行,則$?變量會顯示數字0,反之則顯示一個非零的數字(可能為1,也可能為2,取決於系統版本)。因此可以使用整數比較運算符來判斷$?變量是否為0,從而獲知那條語句的最終判斷情況。這裏的服務器IP地址為192.168.10.10,我們來驗證一下腳本的效果:
技術分享圖片
這便是if語句雙分支結構


if條件語句的多分支結構由if、then、else、elif、fi關鍵詞組成,它進行多次條件匹配判斷,這多次判斷中的任何一項在匹配成功後都會執行相應的預設命令,相當於口語的“如果……那麽……如果……那麽……”。if條件語句的多分支結構是工作中最常使用的一種條件判斷結構,盡管相對復雜但是更加靈活,


if 條件測試操作1
then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi


if 分數為85-100之間
then 判為優秀
elif 分數為70-84之間
then 判為合格
else
判為不合格
fi


下面使用多分支的if條件語句來判斷用戶輸入的分數在哪個成績區間內,然後輸出如Excellent、Pass、Fail等提示信息。在Linux系統中,read是用來讀取用戶輸入信息的命令,能夠把接收到的用戶輸入信息賦值給後面的指定變量,-p參數用於向用戶顯示一定的提示信息。在下面的腳本示例中,只有當用戶輸入的分數大於等於85分且小於等於100分,才輸出Excellent字樣;若分數不滿足該條件(即匹配不成功),則繼續判斷分數是否大於等於70分且小於等於84分,如果是,則輸出Pass字樣;若兩次都落空(即兩次的匹配操作都失敗了),則輸出Fail字樣
腳本內容如下:
技術分享圖片
運行測試一下:
技術分享圖片
再輸入200試試:
技術分享圖片
報錯,
因為我們限制輸入的數字為0--100
下面我們來優化一下,使大於100小於0時輸出Error:
技術分享圖片
運行一下:

技術分享圖片
達到預期效果。


51. for條件循環語句

for循環語句允許腳本一次性讀取多個信息,然後逐一對信息進行操作處理,當要處理的數據有範圍時,使用for循環語句再適合不過了。for循環語句的語法格式如下:


for 變量名in 取值列表
do
命令序列
done


for 用戶名in列表文件
do
創建用戶並設置密碼
done


下面使用for循環語句從列表文件中讀取多個用戶名,然後為其逐一創建用戶賬戶並設置密碼。首先創建用戶名稱的列表文件users.txt,每個用戶名稱單獨一行。讀者可以自行決定具體的用戶名稱和個數:

技術分享圖片
接下來編寫Shell腳本lgm.sh。在腳本中使用read命令讀取用戶輸入的密碼值,然後賦值給PASSWD變量,並通過-p參數向用戶顯示一段提示信息,告訴用戶正在輸入的內容即將作為賬戶密碼。在執行該腳本後,會自動使用從列表文件users.txt中獲取到所有的用戶名稱,然後逐一使用“id 用戶名”命令查看用戶的信息,並使用$?判斷這條命令是否執行成功,也就是判斷該用戶是否已經存在。
需要多說一句,/dev/null是一個被稱作Linux黑洞的文件,把輸出信息重定向到這個文件等同於刪除數據(類似於沒有回收功能的垃圾箱),可以讓用戶的屏幕窗口保持簡潔。

技術分享圖片
運行:
技術分享圖片
報錯!
註意,問題出在了第三行:
‘cat users.txt‘
這個是反引號,而不是單引號!
改正後運行:

技術分享圖片
再次運行:
技術分享圖片


執行批量創建用戶的Shell腳本lgm.sh,在輸入為賬戶設定的密碼後將由腳本自動檢查並創建這些賬戶。由於已經將多余的信息通過輸出重定向符轉移到了/dev/null黑洞文件中,因此在正常情況下屏幕窗口除了“用戶賬戶創建成功”(Create success)的提示後不會有其他內容。
在Linux系統中,/etc/passwd是用來保存用戶賬戶信息的文件。如果想確認這個腳本是否成功創建了用戶賬戶,可以打開這個文件,看其中是否有這些新創建的用戶信息。
技術分享圖片
可以看到用戶已都全部添加


剛剛在if條件語句中,測試主機是否在線,下面嘗試讓腳本從文本中自動讀取主機列表,然後自動逐個測試這些主機是否在線:
首先創建的主機列表文件:
ipadds.txt
技術分享圖片


然後前面的雙分支if條件語句與for循環語句相結合,讓腳本從主機列表文件ipadds.txt中自動讀取IP地址(用來表示主機)並將其賦值給HLIST變量,從而通過判斷ping命令執行後的返回值來逐個測試主機是否在線。
腳本內容如下:
技術分享圖片
運行看看:
技術分享圖片
顯示全部在線,是有錯誤嗎?應該是沒有的,因為另外幾個IP是我雲計算平臺開的雲主機,為了驗證我們在ipadds.txt中隨便添加兩個IP:
技術分享圖片
下面執行看看:
技術分享圖片
所以驗證得出腳本沒有問題:
技術分享圖片


今日就先到這裏。

Linux進階第八天