shell循环语句及实验

一,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值