shell腳本(二)--if流程控制語句和for循環語句的使用
1、在簡單的腳本中各條語句按順序執行,從而實現自動化的管理,
順序單一執行太過機械化,不夠“智能”,難以實現更加靈活的系統任務。
例如:批量安裝軟件包
100臺機器 50臺已安裝 50臺未安裝
2、shell環境根據$?來判斷是否執行成功,當返回值為0時代表執行成功。如果是非0則代表執行異常一般為1或者為1到127之間的整數。
3、常用的邏輯測試
&&:邏輯與,“並且而且”的意思 滿足兩個條件
||:邏輯或,“或者”的意思 滿足兩個條件中的一個
! : 邏輯否
邏輯與&&是指並且而且的意思,只有前後兩個條件都成立時才會返回值為0(成立)否則就是非0(不成立)
邏輯與-實例
先進入到/usr目錄在顯示當前所在目錄,如果cd沒有進入目錄後面的命令是不會執行的
邏輯或-實例
實戰—1
我們通過邏輯表達判斷一下兩個變量的值
2、數值的比較
-eq:等於(Equal)
-ne:不等於(Not Equal)
-gt:大於(Greater Than)
-lt:小於(Lesser Than)
-le:小於或等於(Lesser or Equal)
-ge:大於或等於(Greater or Equal)
格式 [ 數值1 操作符 數值2 ]
3.字符串比較
= 字符串內容相同
!= 字符串內容不同
-z 字符串內容為空
! 取反的意思.
實戰1--
若要判斷當前系統的語言環境,當發現不是en.US時輸出提示信息“$LANG”
$LANG變量是定義當前系統的語言屬於環境變量
取反就是不等於的意思
實戰2—
-z為對於為賦值的變量進行測試
2-1-單分支if語句的格式
if 條件測試操作
then
命令序列
fi
單分支的結構非常簡單,條件成立就執行then命令序列,條件不成立則fi結束
實戰—1
2-2-雙分支IF語句
雙分支的選擇結果,要求針對條件成立,條件不成立兩種情況分別執行不同的操作
語法結構
if 條件測試操作
then(條件成立執行)
命令序列1
else(否則,條件不成立,則執行)
命令序列2
fi
實戰1—
我們編寫一個連通性測試腳本通過位置參數$1提供目標主機地址,然後根據ping檢測結果給出相應提示
-c ping包的次數
-i ping包的間隔
-w 超時的時間間隔
腳本解釋:如果if判斷為0則接下來執行then輸出目標主機up
如果不為0則執行else輸出目標主機down
2-3-多分支if語句
由於if語句可以根據測試結果的成立,
不成立分別執行,所以可以嵌套使用,進行多次判斷.
if 條件測試操作1
then
命令序列1
elif 條件測試2
then
命令序列2
else
命令序列3
fi
多分支if語句應用
1. 編寫一個成績分檔腳本gradediv.sh根據輸入不同的分數來區分優秀、合格、不合格三擋
vim gradediv.sh
首先判斷是否大於85 小於 100 如果符合則輸出優秀並結束判斷
如果小於85 並且大於 60 為優秀 執行then 輸出合格
否則 都執行else 其余的都是不合格繼續
執行的結果
實戰部分
1、編寫腳本程序用於監視系統服務httpd的運行狀態,要求如下
當服務狀態失敗時在"/var/log/httpderr.log"文件中記入日誌信息。
自動將狀態失敗的httpd服務重新啟動。若重啟httpd服務失敗,測嘗試重新啟動服務器主機
vim httpd.sh
查看 /var/log/httpderr.log
2、編寫uname.sh腳本判斷當前系統的內核主次版本若大於2.4則輸出當前版本否則輸出提示當前版本太低
過濾主版本號
過濾出次版本號
vim kernel.sh
執行:
3-1-for循環語句的結構
使用for循環語句時,需要指定一個變量及可能的取值列表。跟對不同的取值,執行相同的命令序列直到變量的值取完遍退出循環。取值列表稱為for語句的執行條件
for語句執行的語法結構
for 變量名 in 取值列表
do
命令序列
done
其種 變量名可以自定義,do裏面還可以嵌套多個if語句done結束循環
in乃是關鍵字,從哪裏取值,多個取值之間使用空格隔開
實驗環境:有些時候我們的系統需要多個用戶的時候,並且用戶名使用員工的拼音為用戶名這是也可以使用for循環進行創建並設置初始密碼
我們先從人事部取來員工的姓名列表將這個列定義為取值列表
我們這裏模擬創建一個
這些用戶就作為取值,都是一些廠家的名字.
vim users.txt
查看創建成功的用戶
編輯一個腳本 添加用戶vim adduser.sh
首先定義一個變量作為取值列表
將取值列表賦予變量user
嵌套一個if語句判斷用戶是否存在,如果存在則輸出用戶已存在,否則執行else的命令序列進行添加用戶並且設置密碼實現取值循環
if判斷使用grep 和awk 過濾出/etc/passwd的第一個字段
使用user_a與取值列表進行比較如果等於則輸出用戶已存在,如果不等於則執行else的命令序列
執行腳本:sh –x adduser.sh
再次執行
輸出了用戶已存在,
若要刪除剛剛創建的用戶可以編寫腳本
vim deluser.sh
執行:
好了這就是批量創建用戶和批量刪除用戶
案例根據ip地址列表檢測主機狀態
建立一個ip地址取值列表
vim ip.txt
vim ping.sh
判斷一下當前主機是否存活,如果存活 輸出 host is up 否則輸出 host is down
這就是簡單的for循環語句的應用
shell腳本(二)--if流程控制語句和for循環語句的使用