Shell编程之循环语句(for、while、until)
文章目录
1.for语句的结构
总结:
条件需要你预先已经知道会出现哪些情况,根据情况做出措施。
循环的主体是一些重复性的操作,当然了,重复性的操作也有循环条件的,这个循环条件是可以后给的。
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态,根据IP地址黑名单设置拒绝访问的防火墙策略等。
当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。而for循环语句,可以很好地解决类似问题。
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值使用完退出循环。在这里,“取值列表”称为for语句的指行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单等)。
读取不同的变量值,用来逐个执行同一组命令
示例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语句。
重复测试某个条件,只要条件成立则反复执行
使用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则是在条件为假时执行循环
重复测试某个条件,只要条件不成立则反复执行
示例1
计算1~50的和值
通过循环累加的方式计算1-50的和值
#!/bin/bash
i=1
sum=0
until [ $i -eq 51 ]
do
let sum+=$i
let i++
done
echo "和为:$sum"
推荐阅读
-
mysql存储过程之循环语句(WHILE,REPEAT和LOOP)用法分析
-
linux shell常用循环与判断语句(for,while,until,if)使用方法
-
linux shell循环:for、while、until用法详解
-
Shell脚本——for,while,until循环
-
shell脚本编程之循环语句
-
shell脚本快速入门之-----循环(for、while、until)
-
04 shell编程之循环语句
-
循环判断语句 ---for循环语句、while循环语句、until循环语句(1)
-
Shell编程之case语句与循环语句
-
Shell脚本for、while循环语句及case分支语句