目錄
一. for 循環語句
1. for語句的結構
2. for 語句應用示例
(1) 根據姓名列表批量添加用戶
(2) 根據 IP 地址列表檢查主機狀態
二. 使用 while 循環語句
1.?while 語句的結構
2. while 語句應用示例
(1) 批量添加規律編號的用戶
(2) 猜價格游戲?
三. until 循環語句
1. until?語句的結構
2. until?語句應用示例
(1) 為指定用戶發送在線消息
在 Shell?編程的廣闊領域中,循環語句與函數無疑是兩大不可或缺的基石。它們不僅能夠顯著提升腳本的執行效率,還能極大增強腳本的可讀性和可維護性。
循環語句,作為自動化處理重復任務的利器,在 shel1 編程中扮演著至關重要的角色。for 循環、while循環以及 unti1 循環,各具特色,分別適用于不同的應用場景。
for 循環擅長處理預定義的列表,如批量創建用戶賬號;while 循環則更適用于需要按特定條件重復執行操作的場景;until?循環則與 while 循環相反,在條件為假時執行循環體。
一. for 循環語句
在實際工作中,經常會遇到某項任務需要多次執行的情況,而每次執行時僅僅是處理的對象不一樣,其他命令相同。
當面對各種列表重復任務時,使用簡單的 if 語句已經難以滿足要求,而順序編寫全部代碼更是顯得異常煩瑣、困難重重。
1. for語句的結構
使用 for 循環語句時,需要指定一個變量及可能的取值列表,針對每個不同的取值重復執行相同的命令序列,直到變量值用完退出循環。在這里,“取值列表”稱為 for 語句的執行條件,其中包括多個屬性相同的對象,需要預先指定(如通訊錄、IP 黑名單)。
for 變量名 in 取值列表
do命令序列
done
for 語句的操作對象為用戶指定名稱的變量,并通過 in 關鍵字為該變量預先設置了一個取值列表,多個取值之間以空格進行分隔。位于 do.done 之間的命令序列稱為循環體,執行語句需要引用變量以完成相應的任務。
2. for 語句應用示例
(1) 根據姓名列表批量添加用戶
根據人事部門給出的員工姓名的拼音列表,在Linux 服務器中添加相應的用戶賬號,初始密碼均設置為“123456”。其中,員工姓名列表中的賬號數量并不固定,而且除了要求賬號名稱是拼音之外,并無其他特殊規律。
可先指定員工列表文件 users.txt,然后編寫一個名為 uaddfor.sh 的 Shell?腳本,從 users.txt 文件中讀取各用戶名稱,重復執行添加用戶、設置初始密碼的相關操作。
列表文件
批量添加用戶的腳本
?
?若要刪除 uaddfor.sh 腳本所添加的用戶,只需參考上述腳本代碼,將 for 循環體中添加用戶的命令序列改為刪除用戶的操作即可。
執行查看發現它已經刪除了
(2) 根據 IP 地址列表檢查主機狀態
根據包含公司各服務器 IP 地址的列表文件,檢査其中各主機的 ping 連通性,輸出各主機是否啟動、關閉。其中,服務器的數量并不固定,各服務器的IP地址之間也無特殊規律。
可先指定 IP 地址列表文件 ipadds.txt,然后編寫一個名為 chkhosts.sh 的Shell?腳本,從 ipadds.txt 文件中讀取各服務器的 IP 地址,重復執行 ping 連通性測試,并根據測試結果輸出相應的提示信息。
?其中ping -c 3 -i 0.2 -w 3 分別指的是-c:發送包的數量? -i:發送包的間隔? -w:超時時間
do…done 循環體內嵌套使用了 if 條件選擇語句,用來針對不同 IP 地址的測試吉果進行判斷,并輸出相應的提示信息。嵌套可以理解為鑲嵌、套用,就是在已有的語句、函數中在多加個或多個語句、函數等。實際上,if 語句、for 語句及其他各種 Shell?腳本語句都是可以嵌套使用的
二. 使用 while 循環語句
for 循環語句非常適用于列表對象無規律,且列表來源已固定(如某個列表文件)的場合。而對于要求控制循環次數、操作對象按數字順序編號、按特定條件執行重復操作等情況,則更適合使用另外一種循環-while 語句。
1.?while 語句的結構
使用 while 循環語句時,可以根據特定的條件反復執行一個命令序列,直到該條件不再滿足時為止。在腳本應用中,應該避免出現死循環的情況,否則后邊的命令操作將無法執行。因此,循環體內的命令序列中應包括修改測試條件的語句,以便在適當的時候使測試條件不再成立,從而結束循環。
while 循環語句的語法結構
while 條件測試操作
do命令序列
done
while 語句的執行流程:首先判斷 while 后的條件測試操作結果,如果條件成立,則執行 do..done循環體中的命令序列:返回 while 后再次判斷條件測試結果,如果條件仍然成立,則繼續執行循環體:再次返回到 while 后,判斷條件測試結果…如此循環,直到 while 后的條件測試結果不再成立為止,最后跳轉到 done 語句,表示結束循環
使用 while 循環語句時,有兩個特殊的條件測試操作,即 true(真)和 false(假)。使用 true作為條件時,表示條件永遠成立,循環體內的命令序列將無限執行下去,除非強制終止腳本(或通過 exit語句退出腳本);反之,若使用 false 作為條件,則循環體將不會被執行。這兩個特殊條件也可以用在 if語句的條件測試中。
2. while 語句應用示例
(1) 批量添加規律編號的用戶
在一些技術培訓和學習領域,出于實驗或測試的目的,需要批量添加用戶賬號,這些用戶的名稱中包含固定的前綴字串,并按照數字順序依次進行編號,賬號的數量往往也是固定的。
若要添加 20 個用戶,名稱依次為 stu1、stu2、…、stu20,可以參考以下操作。
使用變量 i 來控制用戶名稱的編號,初始賦值為 1,并且當取值大于 28 時終止循環。在循環體內部,通過語句“let i++”(等同于 i='expr $i +1`)來使變量 i 的值增加 1,因此當執行第一次循環后 i 的值將變為 2,執行第二次循環后 i 的值將變為 3,…依此類推。
若要刪除 uaddwhile.sh 腳本所添加的用戶,只需參考上述腳本代碼,將 while 循環體中添加用戶的命令序列改為刪除用戶的操作即可。
(2) 猜價格游戲?
由腳本預先生成一個隨機的價格數目(0~999)作為實際價格,判斷用戶猜測的價格是否高出或低于實際價格,給出相應提示后再次要求用戶猜測;一直到用戶猜中實際價格為止,輸出用戶共猜測的次數、實際價格。
主要設計思路如下:通過環境變量 RANDOM 可獲得一個小于 216 的隨機整數,計算其與 1000 的余數即可獲得 0~999 的隨機價格;反復猜測操作可以通過以 true 作為測試條件的while 循環實現,當用戶猜中實際價格時終止循環;判斷猜測價格與實際價格的過程采用 if 語句實現,嵌套在 while 循環體內;使用變量來記錄猜測次數。
三. until 循環語句
1. until?語句的結構
until?循環與 while 循環類似,while 循環能實現的腳本 unti1 同樣也可以實現,但區別是while循環在條件為真是繼續執行循環,而 until?則是在條件為假時執行循環.
until?循環語句的語法結構
until 條件測試操作
do命令序列
done
until?語句的執行流程:首先判斷 until?后的條件測試操作結果,如果條件不成立,則執行 do..done循環體中的命令序列;返回 until?后再次判斷條件測試結果,如果條件仍然不成立,則繼續執行循環體;再次返回到 until?后,判斷條件測試結果!…如此循環,直到 until?后的條件測試結果成立為止,最后跳轉到 done 語句,表示結束循環。
2. until?語句應用示例
在一些科學計算領域,經常會用到各種數的計算,自然數的求和操作是最簡單的。本例中計算從 1 到58 的和,從1 開始相加,采用循環的方式,每次循環后加 1,將得到的值加入計算的和中,數字運算采用的是 let 方式,直到加到 50 為止
在 i 的值小于 50 之前,每次循壞 i 的值加 1,開且求出 s 的值?
(1) 為指定用戶發送在線消息
公司內部有一臺 Linux 測試服務器,開發、測試、運維都在使用自己的賬號連接登錄到服務器上。當業務增加不能滿足使用需求時,運維決定給服務器增加內存配置,要通知開發和測試人員保存數據退出,之后再關機升級內存,以應對業務的增加。
針對上面的需求,可編寫一個名字為 until-user_online_to_write.sh 的 Shell 腳本,用于給已登錄用戶發送消息,對用戶進行檢測,必須是系統內用戶并且處于登錄狀態,通過 Linux 的 write 命令來發送消息,具體的腳本如下所示。
?
??
測試時用戶在已登錄狀態才能看到信息 用戶那面會顯示EOF