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