Shell的四种循环结构

1.1.Shell循环-----for 

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

                 do

                  循环体

                  done

示例如下:

   邀请用户修改ip的密码:

Shell的四种循环结构

2.Shell循环----while    循环次数不是固定的

  

     While语句结构

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

while 条件测试

do

循环体

done

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

  示例:每秒显示一个数字,一次递增+1

while :

do

let i++

sleep 1

echo $i

done

 3.shell循环----until

       二、until语法结构

until 条件测试

do

循环体

done

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

    示例:每隔5秒查看aofa用户是否登录,循环往复。

如果该用户登录,请显示登录并退出监控程序;

否则显示当前时间,并输出aofa尚未登录

     #!/bin/bash

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

do       

     echo "$(date) aofa not login"       

     sleep 5

done       

    echo "aofa login"       

exit 0

4.shell循环----expect

   安装expect:

#yum  -y  install   expect  tcl  tclx  tcl-devel

  示例1:

  通过expect解决ssh交互问题

  #!/usr/bin/expect

spawn ssh [email protected]

 

expect {

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

        "password:" { send "666666\r" };

}

Interact

 

 

解释:1.spawn  expect 内部命令,启动一个shell程序。

       2. expect 期望哪些内容

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

      4. password 就send发送 666666

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

      6. interact 允许用户交互

    

  判断是否在线,通过expect进行交互

 #!/bin/bash

#创建一个IP地址文件。

>ip.txt

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

for i in {2..254}

do

        {

        ip=192.168.122.$i

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

        if [ $? -eq 0 ];then

        echo "$ip" >> ip.txt

 

        /usr/bin/expect <<-EOF

set timeout 10

spawn ssh-copy-id $ip

expect {

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

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

}

expect eof

EOF

        fi

        }&

done

wait

echo "finishi..."

 

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

#!/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