前言:当面对各种列表重复任务时,使用if语句已经难以满足要求,而顺序编写全部代码更是显得异常繁琐,困难重重。使用循环、分支等其他程序控制结构,从而能够轻松完成更加复杂、强大的功能。

1、使用for循环语句

1)根据姓名列表批量添加用户

准备员工列表文件users.txt,然后编写一个名为uaddfor.sh的脚本,从users.txt文件中读取各用户名称,重复执行添加用户,设置初始密码的相关操作。

Vi  /root/users.txt

wKioL1gz5FizFiEhAAAevKO9-uE247.png


Vi  uaddfor.sh

wKioL1gz5FiCHDlfAABUSmkJULM111.png


执行脚本:./uaddfor.sh之后查看用户文件cat  /etc/passwd

wKiom1gz5FiwqUGNAAA0pjwUwEo597.png


2)若要删除uaddfor.sh脚本添加的用户,只需要将上面脚本中添加用户的命令改为删除的即可。

wKioL1gz5FnigrwDAAAwDvAr6w4557.png


Vi  udelfor.sh

wKiom1gz5FnjSw3nAAA6yYiYPek826.png

执行脚本之后发现用户已经删除

 

3)根据ip地址列表查看主机状态

首先建立ip地址列表文件ipadds.txt,然后编写一个名为chkhosts.shshell脚本,从ipadds.txt文件中读取各服务器的ip地址,重复执行ping连通性测试,并根据测试结果输出相应的提示信息。

Vi  /root/ipadds.txt

wKioL1gz5FmTrX2hAAAdbTUjbNs714.png


编写脚本vi chkhosts.sh

wKiom1gz5FqBPxZfAABM7yC6MGA715.png


执行脚本

wKiom1gz5FqRfgpFAAA0lu_J3U4762.png


2、使用while循环语句

For循环适合无规律,列表已固定,while循环适合要求循环次数,操作对象按数字顺序编号,按特定条件执行重复操作的情况。

1)批量添加规律编号的用户,添加20个用户,名称依次为stu1stu2... Stu20

Vi  uaddwhile.sh

wKioL1gz5FqTw4bdAABIEW-7g-Y308.png


执行脚本之后查看用户:cat /etc/passwd

wKiom1gz5FvxOXd_AAAYSnviPG8557.png


2)删除所添加的用户,只需将上述代码修改即可

wKiom1gz5HOytrlTAAAitOim6kI698.png


Vi  udelwhile.sh

wKioL1gz5HOzGUZkAAAzkzyLNSU293.png

执行脚本之后查看用户是否被删除

 

 

3)猜价格游戏

思路:通过环境变量RANDOM可获得一个小于216次方的随机整数,计算其与1000的余数即可获得0-999的随机价格,反复猜测操作可以通过以true作为测试条件的while循环实现,当用户猜中实际价格时终止循环,判断猜测价格与实际价格的过程采用if语句实现,嵌套在while循环体内,使用变量来记录猜测次数。

Vi  pricegame.sh

wKioL1gz5HOCZjzzAABwNrNysw0539.png


Chmod  +x  pricegame.sh

./pricegame.sh执行脚本

wKiom1gz5HSjf89qAACI010htMY816.png


3、使用case分支语句

Case语句可以使用脚本程序的结构更加清晰。

1)检查用户输入一个字符,通过case语句判断该字符是否为字母,数组或其他控制字符,并给出相应的提示信息。

Vi  hitkey.sh

wKiom1gz5HSSSKh-AABHhjo1nqE244.png


执行脚本的效果:

wKioL1gz5HSzdV2jAABLF4tdHJ8011.png


2)编写系统服务脚本

通过位置变量$1指定的startstoprestartstatus控制参数,分别用来启动、停止、重启sleep进程,以及查看sleep进程的状态。

Vi  myprog

wKiom1gz5HWi0q_FAABtpSQlaYM809.png


然后执行下面的命令添加myprog为系统服务

wKioL1gz5HWzpa66AABx08ihYZo724.png





综合案例

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

…… //省略部分内容

wKiom1gz5HaTo8dlAABj5TFGmwg389.png


执行脚本之后查看/etc/ethers文件

chmod +x getarp

./getarp

Cat  /etc/ethers

wKioL1gz5HbAzafxAAAwI8O99bQ876.png


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上执行脚本

wKiom1gz5ImyMQ9dAADsiIGzSBQ021.png

 

B上安装vsftpd,如下图所示:

wKioL1gz5IqilPEPAACUHQvs37E794.png


Vim /etc/vsftpd/vsftpd.conf启用匿名,默认就启用了,我们查看一下:

wKiom1gz5Iqz5QuzAABdnqDP5Gs346.png


开启ftp服务

Service  vsftpd  start

A上登录ftp 192.168.1.2测试,如果不能使用ftp命令,则需要安装ftp-0.17......

wKioL1gz5IuA-pWfAACHvof4jUE496.png


wKiom1gz5IuR0jQvAABA7pAEa1I318.png


最后在A上执行脚本./scanhost.sh

wKioL1gz5IyDz98TAAA0cs9JDnk332.png

执行脚本之后发现192.168.1.2开启了ftp匿名登录。