For循環語句
1、for語句的結構與邏輯:
? ? 使用for循環語句時,我們需要指定一個變量以及取值列表,針對每個不同的取值重復執行相同的命令序列,直到變量使用完退出循環。結構如下:
for 變量 in 取值列表do命令序列done
? ? 對于for語句的操作對象——用戶指定名稱的變量,并通過in關鍵字為該變量預先設置了一個取值列表,多個取值之間以空格進行分隔。然后位于do...done之間的命令序列稱為循環體,其中的執行語句需引用變量以完成相應的任務。邏輯圖如下:
?2、應用示例:
(1)根據姓名列表批量添加用戶
[root@localhost ~]#vim /root/users.txt //用于測試的列表文件
zhangsan
lisi
wangwu[root@localhost ~]#vim uadd.sh //批量添加用戶的腳本
#!/bin/bash
ULIST=$(cat /root/users.txt)for UNAME in $ULIST
douseradd $UNAMEecho "aptech" | passwd --stdin $UNAME &>/dev/null
done[root@localhost ~]#chmod +x uaddfor.sh[root@localhost ~]#./uaddfor.sh //測試并確認執行結果[root@localhost ~]#tail -3 /etc/passwd
zhangsan:x:... ... //省略內容[root@localhost ~]#vim udelfor.sh //測試并確認結果[root@localhost ~]#id zhangsan
id: zhangsan: no such user //無此用戶
(2)根據IP地址列表檢查主機狀態
[root@localhost ~]#vim /root/ipadds.txt //測試的列表文件
176.16.16.1
192.168.137.1
192.168.137.254[root@localhost ~]#vim chkhosts.sh //循環檢查各主機的腳本
#!/bin/bash
HLIST=$(cat /root/ipadd.txt)for IP in $ HLIST
doping -c 3 -i 0.2 -W 3 $IP &> /dev/null//-c 發送包的數量;-i 發送ping包間隔;-W 超時時間
if [ $? -eq 0 ]
thenecho "Host $IP is up."
elseecho "Host $IP is down."
fi
done[root@localhost ~]#chmod +x chkhosts.sh[root@localhost ~]#./chkhost.sh //測試并確認執行結果
Host 172.16.16.1 is down.
Host 192.168.137.1 is down.
Host 192.168.137.254 is up.
While循環語句
1、while語句的結構與邏輯:
? ? 根據特定的條件反復執行一個命令序列,直到該條件不再滿足時為止。注意避免出現死循環的情況的情況,否則之后的命令操作將無法進行。結構如下:
while 條件語句操作
do 命令序列
done
? ? 使用while循環語句時,有兩個特殊的條件測試操作,即true(真)和false(假)。使用true作為條件,條件永遠成立,命令序列將無限執行;使用false作為條件,則循環體將不會被執行。這兩個特殊條件也可以用在if語句的條件測試中。邏輯圖如下:
?2、應用示例:
(1)批量添加規律編號的用戶
[root@localhost ~]#vim uadd.sh //批量添加用戶的腳本
#!/bin/bash
PREFIX="lemon"
i=1
while [ $1 -le 20 ]
douseradd ${PREFIX}$iecho "123456" | passwd --stadin ${PREFIX}$i &> /dev/nulllet i++
done
[root@localhost ~]#chmod +x uadd.sh
[root@localhost ~]#./uadd.sh
[root@localhost ~]#grep "lemon" /etc/passwd | tail -3
lemon11:x:... ... //省略部分信息
[root@localhost ~]#vim /udel.sh //批量刪除用戶的腳本
#!/bin/bash
PREFIX="lemon"
i=1
while [ $i -le 20 ]
douserdel -r ${PREFIX}$ilet i++
done
[root@localhost ~]#chmod +x udel.sh
[root@localhost ~]#./udel.sh //測試并確認結果
[root@localhost ~]#id lemon20
id:lemon20:無此用戶
Until 循環語句
(1)until語句的結構:
? ? until與while完全相反,while循環在條件為“真”是繼續執行循環,而until則是在條件為假時執行循環。結構如下:
until 條件測試操作
do命令序列
done
? ? until語句首先判斷until后的條件測試結果,如果條件不成立,則執行do...done循環體中的命令序列;返回until后再次判斷條件測試結果,如果條件仍然不成立,則繼續執行循環體;再次返回到until后,判斷條件測試結果...直到測試結果成立為止,跳到done語句,表示結束循環。邏輯如下:
(2)應用示例
為指定用戶發送在線消息
[root@localhost ~]#vim until-user_online_to_write.sh
#!/bin/bash
#檢查參數數量是否足夠
if [ $# -lt 2 ];thenecho "Usage: $0 <username1> <username2> ... <message>"exit 1
fi#提取消息,消息為最后一個參數
message="${!#}"#遍歷除最后一個參數外的所有用戶名
for username in "${@:1:$#-1}"; do#檢查用戶是否為系統內用戶
if ! grep -q "^$username:" /etc/passwd; thenecho "$username is not a valid user on this system."continue
fi#持續檢查用戶是否登錄
while ! who | grep -q "$username"; doecho "$username is not logged on. Waiting for the user to log in ..."sleep 60
done#用戶已登錄,發送消息echo "Sending message to $username..."write "$username" <<EOF
$message
EOFif [ $? -ne 0 ] ; thenecho "Failed to send message to $username."fi
done
[root@localhost ~]#chmod +x until-user_online_to_write.sh
[root@localhost ~]#./until-user_online_to_write.sh root
//發個root自己,消息為空
Message from root@localhost on pts/0 at 16:23 ... Are you ready ? root
EOF