四、shell 循环实战实例

shell 循环

循环分类:

1.循环次数是固定的
2.循环次数是不固定的

================ 循环次数是固定的for循环==============

一、For语法

shell:

for 变量名 [ in 取值列表]
do
循环体
done

1.ping主机
案例1:批量ping网段内的主机
#!/bin/bash
#批量ping主机
#shm
#2020-04-05

#for i in {1..254}
for i in {1,3,4,99}
do
        {       #{}&,将大括号里面的内容放入后台去执行
        ip=192.168.10.$i
        ping -c1 $ip &> /dev/null

        if [ $? -eq 0 ];then
                echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is up" >> /tmp/ip.txt
        else
                echo "$(date +%Y-%m-%d,%H:%M:%S) $ip is down" >> /tmp/noping.txt
        fi
        }&
done
wait
echo "检测完毕,请到/tmp/ip.txt | /tmp/noping.txt 下查看记录"
案例2:通过文件批量ping网段内的主机
#!/bin/bash

for ip in `cat /shell/ip.txt`
do
        ping -c1 -W1 $ip &>/dev/null
        if [ $? -eq 0 ];then
                echo "$ip is up"
        else
                echo "$ip is down"
        fi
done
2.创建用户
案例3:批量创建用户通过read创建
#!/bin/bash
#useradd
#shm
#2020-04-05

while :
do
        read -p "请输入用户部门,密码,数量[caiwu 123.com 5]:" prefix pass num

        printf "user infomation:
        ------------------------
        user prefix:$prefix
        user password:$pass
        user number:$num
        ------------------------
        "
        read -p "你真的确定吗?[y/n]: " action
        if [[ $action = [y,Y] ]];then
                break
        fi
done
echo "开始创建用户..."


for i in `seq -w $num`
do
        user=$prefix$i
        id $user &> /dev/null
        if [ $? -eq 0 ];then
                echo "用户已经存在"
        else
                useradd $user
                echo $pass | passwd --stdin $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$user is created"
                fi
        fi
done
案例四:批量创建用户,通过文件进行创建

vim user.txt

bbb:111
nnn:111
mmm:111

vim user.sh

#!/bin/bash
#shm
#2020-04-05
#useradd for user.txt

#必须要添加上一个文件
if [ $# -eq 0 ];then
        echo "usage:`basename $0` + 文件名"
        exit 1
fi

#防止输入错误
if [ ! -f $1 ];then
        echo "error file"
        exit 1
elif [ -d $1 ];then
        echo "please input `basename $0` file"
fi

#提取用户名和密码进行创建
for line in `cat $1`
do
		if [ ${#line} -eq 0 ];then
                continue        
        fi
        user=$(echo $line | awk -F ":" '{print $1}')
        pass=$(echo $line | awk -F ":" '{print $2}')
        id $user &> /dev/null
        if [ $? -eq 0 ];then
                echo "该用户已经存在"
        else
                useradd $user
                echo "$pass" | passwd --stdin $user &> /dev/null
                if [ $? -eq 0 ];then
                        echo "$user is created"
                fi
        fi
done

[root@localhost shell]# sh user.sh user.txt

3.修改密码
案例:创建批量修改主机密码的shell
#!/bin/bash
#v1.0 by shm 2020-04-05

read -p "修改后的新密码: " pass

for ip in $(cat ip.txt)
do
        {
        ping -c1 -W1 $ip &> /dev/null
        if [ $? -eq 0 ];then
                ssh $ip "echo $pass | passwd --stdin root"
                if [ $? -eq 0 ];then
                        echo "$ip 密码修改为 $pass" >> success_`date +%F`.txt
                else
                        echo "$ip 密码修改失败" >> fail_`date +%F`.txt
                fi
        else
                echo " $ip 该主机未存活"
        fi
        } &
done
wait
echo "修改成功"

二、while 循环语句

====================== 不固定循环次数的while循环 ====================

格式:

while :
do
done


while read line
do

​ $line

done < /usr/*.txt


实例1:while批量创建账号
#!/bin/bash
#while_useradd 
#v1.0 by shm

while read line
do
		if [ ${#line} -eq 0 ];then
                continue
        fi
        user=`echo $line | awk '{print$1}'`
        passwd=`echo $line | awk '{print$2}'`
        id $user &> /dev/null
        if [ $? -eq 0 ];then
                echo "$user 已经存在"
        else
                useradd $user
                echo "$passwd" | passwd --stdin $user &>/dev/null
                if [ $? -eq 0 ];then
                        echo "$user is created "
                fi
        fi
done < user.txt
案例2:不间断ping测试主机是否存活
#!/bin/bash

ip=192.168.10.2

i=1
while ping -c1 -W1 $ip &> /dev/null
do
        sleep 5
        let num=i++
        echo "ping$num次"
done
echo "$ip is down"
实例3:测试一个网段内存活的主机
#!/bin/bash

i=1

while [ $i -le 254 ]
do
        {
        ip=192.168.10.$i
        ping -c1 -W1 $ip &> /dev/null
        if [ $? -eq 0 ];then
                echo "$ip is up~"
        else
                echo "$ip is down"
        fi
        }&
        let i++
done
wait
echo "测试结束" 

shell并发控制

1.多线程
2.多进程

while true
do

{

​ 将整个循环体,放在后台执行

} &
done
exec 6 <>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值