前言:当面对各种列表重复任务时,使用if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重。使用循环、分支等其他程序控制结构,从而能够轻松完成更加复杂、强大的功能。
1、使用for循环语句
1)根据姓名列表批量添加用户
准备员工列表文件users.txt,然后编写一个名为uaddfor.sh的脚本,从users.txt文件中读取各用户名称,重复执行添加用户,设置初始密码的相关操作。
Vi /root/users.txt
Vi uaddfor.sh
执行脚本:./uaddfor.sh之后查看用户文件cat /etc/passwd
2)若要删除uaddfor.sh脚本添加的用户,只需要将上面脚本中添加用户的命令改为删除的即可。
Vi udelfor.sh
执行脚本之后发现用户已经删除
3)根据ip地址列表查看主机状态
首先建立ip地址列表文件ipadds.txt,然后编写一个名为chkhosts.sh的shell脚本,从ipadds.txt文件中读取各服务器的ip地址,重复执行ping连通性测试,并根据测试结果输出相应的提示信息。
Vi /root/ipadds.txt
编写脚本vi chkhosts.sh
执行脚本
2、使用while循环语句
For循环适合无规律,列表已固定,while循环适合要求循环次数,操作对象按数字顺序编号,按特定条件执行重复操作的情况。
1)批量添加规律编号的用户,添加20个用户,名称依次为stu1,stu2,... Stu20
Vi uaddwhile.sh
执行脚本之后查看用户:cat /etc/passwd
2)删除所添加的用户,只需将上述代码修改即可
Vi udelwhile.sh
执行脚本之后查看用户是否被删除
3)猜价格游戏
思路:通过环境变量RANDOM可获得一个小于2的16次方的随机整数,计算其与1000的余数即可获得0-999的随机价格,反复猜测操作可以通过以true作为测试条件的while循环实现,当用户猜中实际价格时终止循环,判断猜测价格与实际价格的过程采用if语句实现,嵌套在while循环体内,使用变量来记录猜测次数。
Vi pricegame.sh
Chmod +x pricegame.sh
./pricegame.sh执行脚本
3、使用case分支语句
Case语句可以使用脚本程序的结构更加清晰。
1)检查用户输入一个字符,通过case语句判断该字符是否为字母,数组或其他控制字符,并给出相应的提示信息。
Vi hitkey.sh
执行脚本的效果:
2)编写系统服务脚本
通过位置变量$1指定的start,stop,restart,status控制参数,分别用来启动、停止、重启sleep进程,以及查看sleep进程的状态。
Vi myprog
然后执行下面的命令添加myprog为系统服务
综合案例
1、编写getarp.sh脚本文件
(1)通过arping命令发送ARP请求,根据反馈结果记录MAC地址。
(2)将网段地址(如192.168.4.)赋值给变量NADD,作为检测地址的前缀。
(3)使用while循环语句,重复检测目标并记录MAC地址,主机地址从1-254。
[root@localhost ~]# vi getarp.sh
#!/bin/bash
# 1. 定义网段地址、MAC列表文件
NADD="192.168.4."
FILE="/etc/ethers"
# 2. 发送ARP请求,并记录反馈结果
[ -f $FILE ] && /bin/cp -f $FILE $FILE.old //备份原有文件
HADD=1 //定义起始扫描地址
while [ $HADD -lt 128 ]
do
arping -c 2 -w 1 ${NADD}${HADD} &> /dev/null
if [ $? -eq 0 ] ; then
arp -n | grep ${NADD}${HADD} | awk '{print $1,$3}' >> $FILE
fi
let HADD++
done
[root@localhost ~]# chmod +x getarp.sh
[root@localhost ~]# ./getarp.sh //执行检测程序
[root@localhost ~]# cat /etc/ethers //确认记录结果
192.168.4.12 00:0C:29:C3:F8:51
192.168.4.110 00:50:56:C0:00:01
…… //省略部分内容
执行脚本之后查看/etc/ethers文件
chmod +x getarp
./getarp
Cat /etc/ethers
2、编写scanhost.sh脚本
(1)有很多方法可以检测一个主机是否开启匿名FTP服务,这里采取以wget下载工具访问FTP根目录的方式,若能够成功列表,则视为匿名FTP已开启,否则视为关闭。
(2)通过awk命令过滤出/etc/ethers文件中的所有IP地址,赋值给变量TARGET。
(3)使用for循环语句,读取TARGET变量中的IP地址,重复探测FTP开启情况。
[root@localhost ~]# vi scanhost.sh
#!/bin/bash
TARGET=$(awk '{print $1}' /etc/ethers)
echo "以下主机已开放匿名FTP服务:"
for IP in $TARGET
do
wget ftp://$IP/ &> /dev/null
if [ $? -eq 0 ] ; then
echo $IP
rm -rf index.html //删除测试产生的临时文件
fi
done
[root@localhost ~]# chmod +x scanhost.sh
执行脚本之前在另一台linux服务器B192.168.1.2上搭建ftp服务(使用vsftpd软件),然后在linuxA上执行脚本
在B上安装vsftpd,如下图所示:
Vim /etc/vsftpd/vsftpd.conf启用匿名,默认就启用了,我们查看一下:
开启ftp服务
Service vsftpd start
在A上登录ftp 192.168.1.2测试,如果不能使用ftp命令,则需要安装ftp-0.17......
最后在A上执行脚本./scanhost.sh
执行脚本之后发现192.168.1.2开启了ftp匿名登录。