简介
shell作为一种脚本语言,同样包含循环、分支等其他程序控制结构,从而能够轻松完成更加复杂的工作,具有强大的功能。
1.for循环语句
1.1 for语句的结构与使用条件
- 读取不同的变量值,用来逐个执行同一组命令
for循环语句结构:
命令格式:
for 变量名 in 取值列表
do
命令序列
done
for循环使用条件:
- 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为 for 语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、作黑名单)。
1.2 for语句的应用示例
1)根据IP列表检查主机的状态
项目步骤:创建需要测试的主机列表;创建循环主体,根据ping的结果反馈,判断是否在线或下线(如果为真则认定在线,否则认定是下线)。
[root@localhost~]# vim ipadds.txt //用做测试的列表文件
192.168.1.1
192.168.1.10
192.168.1.20
[root@localhost ~]# vim 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 //-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 //测试并确认执行结果
Host 192.168.1.1 is up.
Host 192.168.1.10 is up.
Host 192.168.1.20 is down.
2)根据姓名列表批量添加用户
项目步骤:循环创建列表里这些用户,并给他们这些设定初始化密码,假设密码设为“123123”
[root@localhost ~]# vim 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 "123123" passwd --stdin $UNAME &>/dev/null
done
[root@localhost ~]# chmod +x uaddfor. sh
[root@localhost ~]# ./uaddfor. sh //测试并确认执行结果
[root@localhost ~]# tail -2 /etc/passwd
lindong:x :1006:1006: :/home/lindong:/bin/bash
hanli:x :1007:1007::/home/hanli:/bin/bash
2.使用while循环语句
- for循环语句非常适用于列表对象无规律,且列表来源固定的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另一种循环–while循环。
2.1 while循环语句结构
使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。
while循环语句的语法结构如下:
while 条件测试操作
do
命令序列
done
while语句的执行流程:
- 首先判断while后的条件测试操作结果,如果条件成立,则执行do…done循环体中的命令序列;
- 返回while后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体;
- 再次返回while后,判断条件测试结果…如此循环,直到while后的条件测试结果不再成立为止,最后跳转到done语句,表示循环结束。
注意:
使用while循环语句时,有两个特殊的条件测试操作,即true(真)和false(假)。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限循环下去,除非强制中止脚本(或通过 exit 语句退出脚本);反之,若使用 false 作为条件时,循环体将不会执行。
2.2 while循环语句应用示例
1)批量添加规律编号的用户
若要添加20个用户,名称依次为sul、su2、…、su20
[root@localhost ~]# vim uaddwhile.sh
#!/bin/bash
i=1
while [ $i -le 20 ] //控制循环条件
do //重复循环执行的操作
uname="su$i"
if [ $uname ==`grep $uname /etc/passwd | awk -F: '{print $1]’` ]
then echo "姓名重复”
fi
useradd $uname
echo 123123 | passwd --stdin $uname &> /dev/null
let i++
done
[root@localhost ~]# chmod +x uaddwhile.sh
[root@localhost ~]# ./uaddwhile.sh
[root@localhost ~]# grep "su"/etc/passwd / tail -3
su18:x:1022:1022::/home/su18:/bin/bash
su19:x:1023:1023::/home/su19:/bin/bash
su20:x:1024:1024::/home/su20:/bin/bash