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 <>