Linux Shell编程及自动化运维实现 第3章 循环

1.for循环

  语法结构

  语法一: for  变量名  in [ 取值列表]

   do

      循环体

   done 

 语法二:For  变量名  in [起始值...终止值 ]

   do

      循环体

   done

示例1:

   for i in {1..5}

do

        echo  "$i"

done

Linux Shell编程及自动化运维实现 第3章 循环

语法三:  for   ((初始值;循环制;变量变化))

   do

      循环体

   done 

示例2:

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

2.for的嵌套循环

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

示题:编写脚本实现9*9乘法表。

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

3.while循环

for循环适用于事先知道循环的次数,对于实现不知道循环的次数,for

循环将会束手无策。而while循环可以解决实现不知道循环次数这类问题。对于事先知道循环次数的问题,for循环和while循环是相同的,for循环能解决的问题,while循环也可以解决。

  语法结构:

while   条件

do

          循环主体

done

 

 

语法<1>

初始值

while  [  条件判断语句  ]

do

           循环主体

           变量变化             

#这里变量变化的方式有两种,一种是((a++)),另外一种是a=`expr  $a  +  1`

done

示例:

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

语法<2>:

初始值

while  ((条件判断语句))

do

           循环主体

         变量变化             

 #这里变量变化的方式有两种,一种是((a++)),另外一种是a=`expr  $a  +  1`

done

示例:

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

语法<3>:死循环(不同于for循环的地方,能解决实现不知道循环次数的问题原因所在)

 

while   true

do

           循环主体

done

Linux Shell编程及自动化运维实现 第3章 循环

Linux Shell编程及自动化运维实现 第3章 循环

4.until语法结构

 语法:

until 条件测试

do

循环体

done

==当条件测试成立(条件测试为假视为成立),执行循环体

示例:

#!/bin/bash

until who | grep "^aofa" &> /dev/null      

do        

    echo "$(date) aofa not login"        

    sleep 5

done        

    echo "aofa login"        

exit 0

循环总结 :固定 for;不固定:while until

 

5.Expect

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

定义:expect是一个用来实现自动交互功能的软件套件。

安装:yum install -y expect tcl tclx tcl-devel


示例1:

(1)通过expect解决ssh交互问题

通过ecpect编写脚本

#!usr/bin/bash

 spawn ssh [email protected]

 

   Expect{

           “yes/no”{send”yes\r”;exp_continue}

             “password:”{send”666666\r”};

}

interact

   (2)登录验证免交互

   spawn  expect 内部命令,启动一个shell程序。

   expect 期盼哪些内容

   yes/no 就send发送yes,\r表示回车

   password 就 send 发送centos

   exp_continue,跳过循环,就继续下一条语句。

   Interact 允许用户交互


expect实战:公钥推送

  准备工作:安装expect,准备公钥

  1. 通过shell循环判断在线主机

     #!/bin/bash

       #创建一个ip地址文件

       >ip.txt   ---清空ip.txt文件内容

        #使用for循环ping测试主机是否在线

        for i in {2..254}

         do

            {

                ip=192.168.0.$i

                Ping -c1 -W1 $ip &> /dev/null

                If [$? -eq 0]

                then

                    echo “$ip” >>ip.txt   

                fi

}&        ---高并发

               done

 

2.通过expect进行交互

     /usr/bin/expect <<-EOF

set timeout 10

spawn ssh-copy-id $ip

expect {

        "yes/no" { send "yes\r"; exp_continue }

        "password:" { send "centos\r" }

}

expect eof

EOF

        fi

        }&

done

wait

echo "finishi..."

#!/usr/bin/expect

set timeout 10

spawn ssh-copy-id 192.168.122.152

expect {

        "yes/no" { send "yes\r"; exp_continue }

        "password:" { send "centos\r" }

}

 

3.优化脚本

#!/bin/bash

#创建一个IP地址文件。

>ip.txt

#检测expect是否安装,检测公钥是否创建。

rpm -q expect &> /dev/null

if [ $? -ne 0 ] ;then

        yum install -y expect

fi

if [ ! -f ~/.ssh/id_rsa ];then

        ssh-****** -P "" -f ~/.ssh/id_rsa

fi

#使用for循环ping测试主机是否在线。之前插入安装和准备秘钥。