Shell 编程之循环语句

目录

一. for 循环语句

1. for 语句的结构

2. for 语句应用示列

(1).根据姓名列表批量添加用户

(2).根据 IP 地址列表检查主机状态

二.使用 while循环语句

1.while 语句的结构

2.while 语句应用示列

(1).批量添加规律编号的用户

(2).猜价格游戏

三. until 循环语句

1.until 语句的结构

2.until 语句应用示列

(1).计算1~50的总和

(2).为指定用户发送在线消息


一. for 循环语句

        在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清单检査各主机的存活状态,根据 IP 地址黑名单设置拒绝访问的防火策略等

        当面对各种列表重复任务时,使用简单的 if语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。本节将要学习的 for 循环语句,可以很好地解决类似问题

1. for 语句的结构

        使用 for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP 黑名单)

for   变量名in取值列表

do

命令序列

done

         上述语句结构中,for 语句的操作对象为用户指定名称的变量,并通过 in 关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于 do…done 之间的命令序列称为循环体,其中的执中行语句需要引用变量以完成相应的任务

        for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行 do…done 循环体中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列…依此类推,直到列表中的所有取值用完,最后将跳至 done 语句,表示结束循环

2. for 语句应用示列

(1).根据姓名列表批量添加用户

 先创建一个文件叫 vim/root/users.txt //测试列表文件,再创建一个脚本 vim aaa.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                 //测试并确认执行结果

使用 for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复 执行相同的命令序列,直到变量值用完退出循环

(2).根据 IP 地址列表检查主机状态

        可先指定 IP 地址列表文件 ipadds.txt,然后编写一个名为 sss.sh 的 Shell 脚本,从 ipadds.txt 文件中读取各服务器的 IP 地址,重复执行 ping 连通性测试, 并根据测试结果输出相应的提示信息

 #!/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 down."
fi
done
[root@localhost ~]# chmod +x chkhosts.sh
[root@localhost ~]# ./chkhosts.sh                 //测试并确认执行结果

 上述脚本代码中,do…done 循环体内嵌套使用了 if 条件选择语句,用来针对不同 IP 地址的测试结果进行判断,并输出相应的提示信息 在各种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,并且当取值大于20时终止循环。在循环体内部,通过语句""let i++”(等同于i=`expr $i +1')来使变量i的值增加1,因此当执行第一次循环后i的值将变为2,执行第二次循环后i的值将变为3,....依此类推。

        若要删除uaddwhile.sh脚本所添加的用户,只需参考上述脚本代码,将while循环体中添加用户的命令序列改为删除用户的操作即可 :

(2).猜价格游戏

        中央电视台著名的"时尚购物街"节目中,有一个猜价格的互动环节,要求参与者在最短的时间内猜出展示商品的实际价格,当所猜的价格高出或低于实际价格时,主持人会给出相应的提示。下面以此环节为原型,编写一个猜价格的 Shell脚本。

案例要求如下:

由脚本预先生成一个随机的价格数目(0~999)作为实际价格,判断用户猜测的价格是否高出或低于实际价格,给出相应提示后再次要求用户猜测;一直到用户猜中实际价格为止,输出用户共猜测的次数、实际价格。

        针对上述要求,主要设计思路如下:通过环境变量RANDOM可获得一个小于216的随机整数,计算其与1000的余数即可获得0~999的随机价格;反复猜测操作可以通过以 true作为测试条件的 while 循环实现,当用户猜中实际价格时终止循环;判断猜测价格与实际价格的过程采用if语句实现,嵌套在 while 循环体内:使用变量来记录猜测次数。

 

三. until 循环语句

1.until 语句的结构

        until循环与while循环类似,while循环能实现的脚本until同样也可以实现,但区别是while循环在条件为真是继续执行循环,而until 则是在条件为假时执行循环。

        until循环语句的语法结构如下所示。

until 条件测试操作
do
    命令序列
done

         until语句的执行流程:首先判断until后的条件测试操作结果,如果条件不成立,则执行do...done循环体中的命令序列;返回until后再次判断条件测试结果,如果条件仍然不成立,则继续执行循环体;再次返回到until后,判断条件测试结果......如此循环,直到until后的条件测试结果成立为止,最后跳转到done语句,表示结束循环,如图示:

2.until 语句应用示列

(1).计算1~50的总和

        在一些科学计算领域,经常会用到各种数的计算,自然数的求和操作是最简单的。本例中计算从1到50的和,从1开始相加,采用循环的方式,每次循环后加1,将得到的值加入计算的和中,数字运算采用的是let方式,直到加到50为止,具体的操作参考如下:

(2).为指定用户发送在线消息

        公司内部有一台 Linux 测试服务器,开发、测试、运维都在使用自己的账号连接登录到服务器上。当业务增加不能满足使用需求时,运维决定给服务器增加内存配置,要通知开发和测试人员保存数据退出,之后再关机升级内存,以应对业务的增加

        针对上面的需求,可编写一个名字为 unti1-user online to write.sh 的 Shel1 脚本,用于给已登录用户发送消息,对用户进行检测,必须是系统内用户并且处于登录状态,通过 Linux的 write 命令来发送消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值