欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Shell编程之循环语句(for、while、until)

程序员文章站 2022-06-24 19:29:38
...

1.for语句的结构

总结:

条件需要你预先已经知道会出现哪些情况,根据情况做出措施。

循环的主体是一些重复性的操作,当然了,重复性的操作也有循环条件的,这个循环条件是可以后给的。

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

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

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

读取不同的变量值,用来逐个执行同一组命令

Shell编程之循环语句(for、while、until)

示例1

需求:根据人事部门给出的员工的拼音列表,在Linux服务器中添加相应的用户账户,初始密码均设置为“123456”。其中员工列表中的账号数量并不固定,而且除了要求账户名称时拼音之外,并无其他特殊规律。

1.创建一个新用户列表,内容根据人事给定的姓名拼音来认定
[aaa@qq.com ~]# vim users.txt
zhangsan
lisi
wangwu
2.循环创建列表里这些用户,并给他们这些设定初始密码,密码为“123456”
[aaa@qq.com ~]# vim uaddfor.sh
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &> /dev/null
done

[aaa@qq.com ~]# sh uaddfor.sh
[aaa@qq.com ~]# tail -f /etc/passwd
......
zhangsan:x:1003:1003::/home/zhangsan:/bin/bash
lisi:x:1004:1004::/home/lisi:/bin/bash
wangwu:x:1005:1005::/home/wangwu:/bin/bash

更改以上脚本
[aaa@qq.com ~]# cat uaddfor.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

示例2

若某些用户离职,把必要文件备份过后,就需要把一些用户连带他的宿主目录删除

1.创建离职用户名单
[aaa@qq.com ~]# cat users.txt
zhangsan
lisi
[aaa@qq.com ~]# cat udelfor.sh
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
   a=`ls -lh /home/$UNAME | awk '{print $2}'`
   if [ $a -ne 0 ]
   then cp -r /home/$UNAME /userfile_backup
   fi
   userdel -r $UNAME &> /dev/null
done

[aaa@qq.com ~]# sh udelfor.sh
[aaa@qq.com ~]# id zhangsan
id: zhangsan: no such user

示例3

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

1.创建需要测试的主机列表
[aaa@qq.com ~]# cat ipadds.txt
192.168.100.11
192.168.100.12
192.168.100.13
2.创建循环主体,根据ping的结果反馈,如果为真则认定其是在线,如果为假则认为其是下线的。
[aaa@qq.com ~]# cat 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
   if [ $? -eq 0 ]
       then echo "host $ip is up"
       else echo "host $ip is down"
   fi
done
[aaa@qq.com ~]# sh chkhosts.sh
host 192.168.100.11 is up
host 192.168.100.12 is up
host 192.168.100.13 is down

示例4

根据列表给定的加班用户,给相应的用户工资加100元

分析:1.确定用户名单 2.根据用户名单加100元

[aaa@qq.com ~]# cat jiaban.txt
zhangsan
lisi
wangwu

[aaa@qq.com ~]# cat gongzi.sh
#!/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
[aaa@qq.com ~]# sh gongzi.sh
zhangsan salary is 3100
lisi salary is 3100
wangwu salary is 3100

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

[aaa@qq.com ~]# cat gongzi.sh
#!/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
[aaa@qq.com ~]# sh gongzi.sh lisi 5
lisi salary is 3500

2.while语句的结构

for循环语句非常适用于列表无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while语句。

重复测试某个条件,只要条件成立则反复执行
Shell编程之循环语句(for、while、until)

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

示例1

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

[aaa@qq.com ~]# cat 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
[aaa@qq.com ~]# sh uaddwhile.sh
[aaa@qq.com ~]# grep "stu" /etc/passwd | tail -5
stu16:x:1016:1016::/home/stu16:/bin/bash
stu17:x:1017:1017::/home/stu17:/bin/bash
stu18:x:1018:1018::/home/stu18:/bin/bash
stu19:x:1019:1019::/home/stu19:/bin/bash
stu20:x:1020:1020::/home/stu20:/bin/bash
[aaa@qq.com ~]# cat uaddwhile2.sh
#!/bin/bash
i=1
while [ $i -le 30 ]
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++
done

3.until语句的结构

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

重复测试某个条件,只要条件不成立则反复执行

Shell编程之循环语句(for、while、until)

示例1

计算1~50的和值
通过循环累加的方式计算1-50的和值

#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ]
do
        let sum+=$i
        let i++
done
echo "和为:$sum"
相关标签: shell脚本