shell编程之循环

时间:2020-9-6 作者:admin

 一、for

语法结构:

for  变量   [ in取值列表 ]

do

循环体

done 

eg:

自动循环创建用户 

[root@master1 ~]# cat 11.sh
#!/bin/bash
for i  in {1..10}
do
useradd $i
echo "$i 创建成功"
done

 for i in $(seq 1 10) 、for i in `seq 10` 也可以。

eg: 

 通过循环工具,探测全网主机,将在线的主机

[root@master1 ~]# vim 22.sh

#!/bin/bash
#ping
for i in {1..20}
do
ip=10.8.162.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ] ; then
   echo $ip >> up.txt
else
   echo $ip >> down.txt
fi
done
~                                                                     
~                                                                     
~                                                                     
"22.sh" 12L, 166C                                   8,4          全部

 ping ip执行的结果:

[root@master1 ~]# cat down.txt
10.8.162.1
10.8.162.2
10.8.162.4
10.8.162.5
10.8.162.8
10.8.162.9
10.8.162.11
10.8.162.12
10.8.162.13
10.8.162.14
10.8.162.17
10.8.162.18
10.8.162.19
10.8.162.20
[root@master1 ~]# cat up.txt
10.8.162.3
10.8.162.6
10.8.162.7
10.8.162.10
10.8.162.15
10.8.162.16

eg:

使用for循环批量修改主机的密码

首先要做免密登录  ssh-keygen   、ssh-copy-id   IP地址

做一个txt文档,将做的免密登录的ip地址记录下来,方便调用。

[root@master1 ~]# vim forpass.sh

#!/bin/bash
read -p "请输入修改的密码: " pass
for i in ` cat passwd.txt  `
do
ping -c1 -w1 $i &> /dev/null
  if [ $? -eq 0 ] ; then
        ssh $i " echo $pass | passwd --stdin root"
        echo "$i"  >> yespass.txt
  else
        echo "$1" >> nopass.txt
  fi
done
"forpass.sh" 12L, 277C                              11,3         全部
[root@master1 ~]# bash forpass.sh
请输入修改的密码: 777777
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。

二、while until

特点:循环次数不(一定是固定的)

while语句结构(死循环,逐行处理文件)

while   条件测试

do

循环体

done   

ps:当条件为真的时候执行循环

eg:

while :
do
let i++
sleep 1  //休息1秒再显示
echo $i
done

eg:创建新用户,输入的密码长度不符合要求达到3次后就直接退出程序。 

[root@master1 ~]# vim user.sh

#!/bin/bash
i=1   //首先要对变量赋值
   read -p "请输入你想创建的用户名字:" name
   if id $name &> null
       then
            echo "用户已存在,请重新创建名字"
       else
            while [ $i -lt 4 ]  //while循环
            do
              let i++

            read -p "请设置密码:" passwd
          if [ ${#passwd} -lt  7 ]  //${#passwd} 记录变量passwd字符的位数
              then
                   echo "输入的密码不符合要求"
               else
                   useradd $name
                   echo $passwd | passwd --stdin $name  &> /dev/null
                   echo " 用户 $name 创建成功,密码为 $passwd"
                   exit 1
           fi
            done
    fi

until 语法结构 

until  条件测试

do

循环体

done

ps:当条件测试成立时(当条件为假视为成立)执行语句

#!/bin/bash
until [ $i -eq 14 ]
do
i++
sleep 1
echo $i
done

三、expect

      Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

1、安装

yum -y install expect tcl tclx tcl-devel

eg:通过expect解决ssh交互wenti

#!/usr/bin/expect
spawn ssh root@192.168.0.111
expect{
     "yes/no" { sebd "yes\r";exp_continue } //exp_continue,跳过循环,就继续下一条语句。
     "password:" { send "666666\r" };
}
interact //允许用户交互

 

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。