一、使用for循环语句
1、for语句的结构
????????使用for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列.直到变量值用完退出循环。在这里."取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单).
????????for 循环语句的语法结构如下所示。
for? ? 变量名? ? in? ? 取值列表
do
? ? ? ? 命令序列
done
????????上述语句结构中,for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do ....... done之间的命令序列称为循环体、其中的执行语句需要引用变量以完成相应的任务。
?2、for语句应用实例
????????1)根据姓名列表批量添加用户
????????根据人事部门给出的员工姓名的拼音列表.在Linux服务器中添加相应的用户账号,初始密码均设置为“123456”。其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外.并无其他特殊规律。
????????针对上述要求,可先指定员工列表文件 users.txt,然后编写一个名为uaddfor.sh的 Shell脚本,从users ,txt文件中读取各用户名称,重复执行添加用户、设置初始密码的相关操作。
[root@lucky u3]# vim users.txt
zhangsan
chengxing
dengchao
luha
lancaihe
[root@lucky u3]# vim useraddfor.sh
#!/bin/bash
list=$(cat /root/u3/users.txt)
for pat in $list
do
useradd $pat
echo "123456" | passwd --stdin $pat &> /dev/null
done
[root@lucky u3]# chmod +x useraddfor.sh
[root@lucky u3]# ./useraddfor.sh
[root@lucky u3]# tail -10 /etc/passwd
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
chengxing:x:1003:1003::/home/chengxing:/bin/bash
dengchao:x:1004:1004::/home/dengchao:/bin/bash
luha:x:1005:1005::/home/luha:/bin/bash
lancaihe:x:1006:1006::/home/lancaihe:/bin/bash
二、使用while循环语句
1、while语句的结构
????????使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行,因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
????????while循环语句的语法结构如下所示
while? ? ? ? 条件测试操作
do
? ? ? ? ?命令序列
done
????????while语句的执行流程:首先判断while后的条件测试操作结果.如果条件成立,则执行do…done循环体中的命令序列;返回while 后再次判断条件测试结果.如果条件仍然成立,则继续执行循环体,再次返回到while后,判断条件测试结果……如此循环.直到while后的条件测试结果不再成立为止.最后跳转到done语句,表示结束循环。
????????使用while 循环语句时,有两个特殊的条件测试操作.即 true(真)和false (假)。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过exit语句退出脚本);反之,若使用false作为条件.则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。
2、while语句应用示例
(1)批量添加规律编号的用户
????????在一些技术培训和学习领域.出于实验或测试的目的.需要批量添加用户账号,这些用户的名称中包含固定的前缀字串,并按照数字顺序依次进行编号,账号的数量往往也是固定的,例如,若要添加20个用户,名称依次为stu1、 stu2、…、stu20,可以参考以下操作。
[root@lucky u3]# vim 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
[root@lucky u3]# chmod +x uaddwhile.sh
[root@lucky u3]# ./uaddwhile.sh
[root@lucky u3]# grep "stu" /etc/passwd | tail -5
stu16:x:1017:1017::/home/stu16:/bin/bash
stu17:x:1018:1018::/home/stu17:/bin/bash
stu18:x:1019:1019::/home/stu18:/bin/bash
stu19:x:1020:1020::/home/stu19:/bin/bash
stu20:x:1021:1021::/home/stu20:/bin/bash
????????若要删除uaddwhile , sh 脚本所添加的用户,只需参考上述脚本代码.将while循环体中添加用户的命令序列改为删除用户的操作即可。
三、实验案例——Shell脚本
? ? ? ? 实验描述
????????编写一个名为getarp.sh 的小脚本,记录局域网中各主机的MAC地址。
????????????????保存到/etc/ether文件中,若此文件已存在,应先转移进行备份。
????????????????每行一条记录,第1列为IP地址.第⒉列为对应的MAC地址。
????????编写一个名为scanhost.sh的扫描脚本,检查有哪些主机开启了匿名FTP服务,扫描对象为/etc/ether 文件中的所有IP地址,扫描的端口为21。
[root@lucky u3]# vim getarp.sh
#!/bin/bash
#定义网段地址、MAC列表文件
nadd="192.168.223."
file="/etc/ethers"
#发送ARP请求,并记录反馈结果
#备份原有文件
[ -f $file ] && /bin/cp -f $file $file.old
#定义起始扫描地址
hadd=1
while [ $hadd -lt 128 ]
do
arping -I ens33 -c 2 ${nadd}${hadd} &> /dev/null
if [ $? -eq 0 ] ; then
arp -n | grep ${nadd}${hadd} | awk '{prink $1 $3}' >>$file
fi
let hadd++
done
[root@lucky u3]# vim scanhost.sh
#!/bin/bash
target=$(awk '{print $1}' /etc/ethers)
echo "以下主机已开放匿名服务:"
for IP in $target
do
wget ftp://$IP/ &> /dev/null
if [ $? -eq 0 ] ; then
echo $IP
#删除测试产生的临时文件
rm -rf index.html
fi
done