Shell—循环语句(for、while、until;各语句区别)

前言

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。 [1] 循环语句是由循环体及循环的终止条件两部分组成的。

for循环语句

for语句的结构
作用: 读取不同的变量值,用来逐个执行同一组命令

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

格式:
for 变量名 in 取值列表
do
命令序列
done

例:
需求1:根据人事部门给出的员工姓名的拼音列表,在Linux服务器中添加相应的用户账号,初始密码均设置为“123456”。
其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外,并无其他特殊规律。
实现:
1.创建一个新用户列表,内容根据人事给定的姓名拼音来认定。

[root@server2 ~]# vim users.txt       #用做测试的列表文件
chenye                                                 #添加用户名
dengchao
zhangjie 

2.循环创建列表里这些用户,并给他们这些设定初始密码,密码为“123456”

[ root@server2 ~]# vi useradd. sh      #批量添加用户的脚本
#!/bin/bash
# 添加用户
ulist=$(cat /root/users. txt)
for uname in $ulist
do
      if [ $uname == `grep $uname  /etc/passwd | awk -F: ‘{print $1}’` ]
      then echo "姓名重复"                         #匹配出现重复的显示
      fi
      useradd $uname                            #不重复的创建账户
      echo "123456" |  passwd -- stdin $uname &> /dev/null
done
[ root@localhost~] # chmod +x useradd. sh   #提权     
[ root@localhost~] # . /useradd. sh                #测试并确认执行结果   

3.若某些用户离职,把必要文件备份过后,就需要把一些用户连带他的宿主目录删除
1).创建离职用户名单

vim users.txt       
chengye
dengchao

2).这些用户删除时连带宿主一并删除

[root@localhost~]# vim udelfor. sh           #批量删除用户的脚本
#!/bin/bash
ulist=$(cat /root/users.txt)
for ulust in $ulist
do
     a=`ls -lh /home/$uname | awk '{print $2}’       #数据量查询
     if [ "$a"!="o"]                                        #当数据量不等于0时
     then cp -r /home/$uname /userfile_backup     #文件备份,备份文件夹需要已存在    
     fi    
     userdel -r $uname &>/ dev/null      #userdel删 除账户,-r 删除用户登入目录以及目录中所有文件
done
[root@localhost~]#chmod +x udelfor. sh      
[root@localhost~]# ./udelfor. sh              #测试并确认执行结果

需求2:
根据包含公司各服务器IP 地址的列表文件,检查其中各主机的 ping 连通性,输出各主机是否启动、关闭。其中,服务器的数量并不固定,各服务器的IP地址之间也无特殊规律。
1.创建需要测试的主机列表

[root@localhost ~]# vim ipadds.txt      #用做测试的列表文件
172.16.16.1
172.16.16.22
172.16.16.220

2.创建循环主体,根据ping的结果反馈,如果为真则认定其是在线,如果为假则认定其是下线的。

[root@localhost ~]# vim chkhosts.sh     #循环检查各主机的脚本
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
      ping -c3 -i 0.2-W 3 $IP &>/dev/null
    #-c发送包的数量;-i发送ping 包间隔;-W超时时间
      if [ $? -eq o ]      #上一条命令执行后返回的状态
      then echo "Host $IP is up."
      else echo "Host $IP is down."
done
[root@localhost~]# chmod +x chkhosts. sh
[root@localhost ~]# ./chkhosts.sh//测试并确认执行结果

需求3:根据列表给定的加班用户,给相应的用户工资加100元。
分析:一.确定用户名单
二.根据用户名单加100元
1.给定名单

#!/bin/bash
#get a salary list
base_money=3000
list=$ (cat /root/ jiaban.txt)
for user in $list
do
            money=$ (expr $base_money + 100)
            echo "$user salary is $money"
done

2.位置变量给定用户和加班天数,算加班工资

#!/bin/bash
# get a salary list
base_money=3000
for user in $1
do
    money=$ (expr $base_money + 100 \* $2)
    echo "$user salary is $money"
done

while循环语句

while语句的结构
作用:重复测试某个条件,只要条件成立则反复执行

使用规则:使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。当测试条件不再成立,从而结束循环。

格式:
while 条件测试操作
do
命令序列
done

例:
需求1:若要添加20个用户,名称依次为stul、 stu2、… stu20

[root@localhost~ ]# vim uaddwhile. sh
#!/bin/bash
i=1
while [ $i -le 20 ]          #控制循环条件
do                 #重复循环执行的操作
         uname=" stu$i "
         if [ $uname == `grep $uname /etc/passwd | awk -F: ’{print  $1}’ ` ]
         then echo"姓名重复"
fi
         useradd $uname
         echo 123456 | passwd --stdin $uname &> /dev/null
         let i++        #自加1继续循环匹配,继续去跟20比对
done
[root@localhost~]# chmod +x uaddwhile. sh
[root@localhost~]# . /uaddwhile. sh

若要把添加的这些用户再删除的话,也可以用while循环去做。

[root@localhost ~]# vim udelwhile.sh     #批量删除用户的脚本
#!/ bin/bash
i=1
while [ $i -le 20 ]             #/控制循环次数
do                     #主结构体是连带宿主目录一并删除的用户
        uname="stu$i"
        a=`ls.-lh /home/$uname / awk ' {print $2}’`
        if [ "$a"!="0"]       #上一条命令执行后返回的状态
        then cp -r / home/ $uname /userfile_backupfi    #备份,备份文件夹需存在
        userdel -r $uname      #userdel删除账户,-r 删除用户登入目录以及目录中所有文件
        let i++          #自加1继续循环匹配,继续去跟20比对
done

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

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

[root@localhost ~]# vim pricegame.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)     #环境变量RANDOM%1000的余数为随机价格
TIMES=0    #猜的次数
     echo "商品实际价格范围为0-999,猜猜看是多少?"
     while true         #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 "太高了!"
     elsel
     echo"太低了!"
     fi
done
root@localhost~]#chmod +x pricegame.sh
[root@localhost~]#./pricegame.sh

until循环语句

until语句的结构
作用:重复测试某个条件,只要条件不成立则反复执行

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

例:计算从1到50的和,从1开始相加,采用循环的方式,每次循环后加1,将得到的值加入计算的和中数字运算采用的是let方式,直到加到50为止

[ root@localhost ]# vi sum_until. sh
#!/bin/ bash
i=0
s=0
until  [ $i -eq 50 ]
do
         let i=$i+1 
         let s=$s+$i 
done
echo “1-50的和为: ”$s
[root@localhost~]# chmod +x sum_until. sh
[root@localhost~]# . / sum_until. sh
1-50的和为:1275

各循环语句间的区别

for;while;until循环语句间的区别
for循环语句:非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。
while循环语句:而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环。
until循环与while循环类似,while循环能实现的脚本until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而until 则是在条件为假时执行循环。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值