文章目录
1.for语句的结构示例1示例2示例3示例42.while语句的结构示例13.until语句的结构示例11.for语句的结构
总结:
条件需要你预先已经知道会出现哪些情况,根据情况做出措施。
循环的主体是一些重复性的操作,当然了,重复性的操作也有循环条件的,这个循环条件是可以后给的。
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如根据通讯录中的姓名列表创建系统账号,根据服务器清单检查各主机的存活状态,根据IP地址黑名单设置拒绝访问的防火墙策略等。
当面对各种列表重复任务时,使用简单的if语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重。而for循环语句,可以很好地解决类似问题。
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值使用完退出循环。在这里,“取值列表”称为for语句的指行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单等)。
读取不同的变量值,用来逐个执行同一组命令
示例1
需求:根据人事部门给出的员工的拼音列表,在Linux服务器中添加相应的用户账户,初始密码均设置为“123456”。其中员工列表中的账号数量并不固定,而且除了要求账户名称时拼音之外,并无其他特殊规律。
1.创建一个新用户列表,内容根据人事给定的姓名拼音来认定[root@server ~]# vim users.txtzhangsanlisiwangwu2.循环创建列表里这些用户,并给他们这些设定初始密码,密码为“123456”[root@server ~]# vim uaddfor.sh#!/bin/bashULIST=$(cat /root/users.txt)for UNAME in $ULISTdouseradd $UNAMEecho "123456" | passwd --stdin $UNAME &> /dev/nulldone[root@server ~]# sh uaddfor.sh[root@server ~]# tail -f /etc/passwd......zhangsan:x:1003:1003::/home/zhangsan:/bin/bashlisi:x:1004:1004::/home/lisi:/bin/bashwangwu:x:1005:1005::/home/wangwu:/bin/bash更改以上脚本[root@server ~]# cat uaddfor.sh#!/bin/bashULIST=$(cat /root/users.txt)for UNAME in $ULISTdoif [ $uname == `grep $UNAME /etc/passwd | awk -F: '{print $1}'` ]then echo "姓名重复"fiuseradd $UNAMEecho "123456" | passwd --stdin $UNAME &> /dev/nulldone
示例2
若某些用户离职,把必要文件备份过后,就需要把一些用户连带他的宿主目录删除
1.创建离职用户名单[root@server ~]# cat users.txtzhangsanlisi[root@server ~]# cat udelfor.sh#!/bin/bashULIST=$(cat /root/users.txt)for UNAME in $ULISTdoa=`ls -lh /home/$UNAME | awk '{print $2}'`if [ $a -ne 0 ]then cp -r /home/$UNAME /userfile_backupfiuserdel -r $UNAME &> /dev/nulldone[root@server ~]# sh udelfor.sh[root@server ~]# id zhangsanid: zhangsan: no such user
示例3
根据包含公司各服务器IP地址的列表文件,检查其中各主机的ping连通性,输出各主机是否启动、关闭。其中,服务器的数量并不固定,各服务器的IP地址之间也无特殊规律。
1.创建需要测试的主机列表[root@server ~]# cat ipadds.txt192.168.100.11192.168.100.12192.168.100.132.创建循环主体,根据ping的结果反馈,如果为真则认定其是在线,如果为假则认为其是下线的。[root@server ~]# cat chkhosts.sh#!/bin/bashHLIST=$(cat /root/ipadds.txt)for ip in $HLISTdoping -c 3 -i 0.2 -W 3 $ip &> /dev/nullif [ $? -eq 0 ]then echo "host $ip is up"else echo "host $ip is down"fidone[root@server ~]# sh chkhosts.shhost 192.168.100.11 is uphost 192.168.100.12 is uphost 192.168.100.13 is down
示例4
根据列表给定的加班用户,给相应的用户工资加100元
分析:1.确定用户名单 2.根据用户名单加100元
[root@server ~]# cat jiaban.txtzhangsanlisiwangwu[root@server ~]# cat gongzi.sh#!/bin/bash# get a salary listbase_money=3000list=$(cat /root/jiaban.txt)for user in $listdomoney=$(expr $base_money + 100)echo "$user salary is $money"done[root@server ~]# sh gongzi.shzhangsan salary is 3100lisi salary is 3100wangwu salary is 3100
位置变量给定用户和加班天数,算加班工作
[root@server ~]# cat gongzi.sh#!/bin/bash# get a salary listbase_money=3000for user in $1domoney=$(expr $base_money + 100 \* $2)echo "$user salary is $money"done[root@server ~]# sh gongzi.sh lisi 5lisi salary is 3500
2.while语句的结构
for循环语句非常适用于列表无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while语句。
重复测试某个条件,只要条件成立则反复执行
使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。当测试条件不再成立,从而结束循环
示例1
需求1:若要添加20个用户,名称依次为stu1、stu2、…、stu20.
[root@server ~]# cat uaddwhile.sh#!/bin/bashprefix="stu"i=1while [ $i -le 20 ]douseradd ${prefix}$iecho "123456" | passwd --stdin ${prefix}$i &> /dev/nulllet i++done[root@server ~]# sh uaddwhile.sh[root@server ~]# grep "stu" /etc/passwd | tail -5stu16:x:1016:1016::/home/stu16:/bin/bashstu17:x:1017:1017::/home/stu17:/bin/bashstu18:x:1018:1018::/home/stu18:/bin/bashstu19:x:1019:1019::/home/stu19:/bin/bashstu20:x:1020:1020::/home/stu20:/bin/bash
[root@server ~]# cat uaddwhile2.sh#!/bin/bashi=1while [ $i -le 30 ]douname=stu$iif [ $uname==`grep $uname /etc/passwd | awk -F: '{print $1}'` ]then echo "姓名重复"fiuseradd $unameecho 123456 | passwd --stdin $uname &> /dev/nulllet i++done
3.until语句的结构
until循环语句与while循环类似,while循环能实现的脚本until同样也可以实现,,但区别是while循环在条件真是继续执行循环,而until则是在条件为假时执行循环
重复测试某个条件,只要条件不成立则反复执行
示例1
计算1~50的和值
通过循环累加的方式计算1-50的和值
#!/bin/bashi=1sum=0until [ $i -eq 51 ]dolet sum+=$ilet i++doneecho "和为:$sum"