一,for循环语句
在工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态,根据 IP 地址黑名单设置拒绝访问的防火墙策略等。
当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。本节将要学习的 for 循环语句,可以很好地解决类似问
for 循环语句的语法结构如下所
for变量名 n取值列表
do
命令序列
done
1根据姓名列表批量添加用户
[root@localhost ~]# vi /root/users.txt //用做测试的列表文件chenye
dengchao zhangjie
[root@localhost ~]# vi uaddfor.sh //批量添加用户的脚本#!/bin/bash
ULIST=$(cat /root/users.txt) for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
done
[root@localhost ~]# chmod +x uaddfor.sh
[root@localhost ~]# ./uaddfor.sh //测试并确认执行结果
[root@localhost ~]# tail -3 /etc/passwd
chenye:x1005:1005::/home/chenye:/bin/bash
dengchaox:1006:1006::/home/dengchao:/bin/bash
zhangji:x:1007:1007::/home/zhangji:/bin/bash
2,根据IP地址列表检查主机状态
[root@localhost ~]# vi /root/ipadds.txt //用做测试的列表文件
172.16.16.1
172.16.16.22
172.16.16.220
[root@localhost ~]# vi chkhosts.sh //循环检查各主机的脚本
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null //-c 发送包的数量;-i 发送 ping 包间隔;-W 超时时间
if [ $? -eq 0 ]
then
echo "Host $IP is up."
else
echo "Host $IP is up."
fi
done
[root@localhost ~]# chmod +x chkhosts.sh
[root@localhost ~]# ./chkhosts.sh //测试并确认执行结果
Host 172.16.16.1 is up.
Host 172.16.16.22 is up.
Host 172.16.16.220 is down.
2,使用while循环语句
for 循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况, 则更适合使用另外一种循环——while 语句
使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。 因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
while 循环语句的语法结构如下所示
while 条件测试操作
do
命令序列
done
1),批量添加规律编号的用户
[root@localhost ~]# vi uaddwhile.sh //批量添加用户的脚本#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ] do
useradd ${PREFIX}$i
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null let i++
done
[root@localhost ~]# chmod +x uaddwhile.sh
[root@localhost ~]# ./uaddwhile.sh
[root@localhost ~]# grep "stu" /etc/passwd | tail -3 stu18:x:1022:1022::/home/stu18:/bin/bash stu19:x:1023:1023::/home/stu19:/bin/bash stu20:x:1024:1024::/home/stu20:/bin/bash
2)猜价格游戏
[root@localhost ~]# vi pricegame.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格范围为 0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" INT let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE" echo "你总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then echo "太高了!"
else
echo "太低了!"
fi
done
[root@localhost ~]# chmod +x pricegame.sh
[root@localhost ~]# ./pricegame.sh
商品实际价格范围为 0-999,猜猜看是多少?
请输入你猜测的价格数目:500 太高了!
请输入你猜测的价格数目:250 太低了!
请输入你猜测的价格数目:375 太高了!
请输入你猜测的价格数目:280 太高了!
请输入你猜测的价格数目:265 太高了!
请输入你猜测的价格数目:253 恭喜你答对了,实际价格是 253
你总共猜测了 6 次
3,until循环语句
until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是
while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环。
until 循环语句的语法结构如下所示。
until 条件测试操作
do
命令序列
done
1),计算 1~50 的和
[root@localhost ~]# vi sum1to50_until_v1.sh
#!/bin/bash i=0;s=0
until [ $i -eq 50 ]
do
let "i=$i+1";let "s=$s+$i"
done
echo 'sum(1..50)='$s
[root@localhost ~]# chmod +x sum1to50_until_v1.sh
[root@localhost ~]# ./sum1to50_until_v1.sh
sum(1..50)=1275