Linux Shell编程及自动化运维实现 第3章 循环
1.for循环
语法结构
语法一: for 变量名 in [ 取值列表]
do
循环体
done
语法二:For 变量名 in [起始值...终止值 ]
do
循环体
done
示例1:
for i in {1..5}
do
echo "$i"
done
语法三: for ((初始值;循环制;变量变化))
do
循环体
done
示例2:
2.for的嵌套循环
示题:编写脚本实现9*9乘法表。
3.while循环
for循环适用于事先知道循环的次数,对于实现不知道循环的次数,for
循环将会束手无策。而while循环可以解决实现不知道循环次数这类问题。对于事先知道循环次数的问题,for循环和while循环是相同的,for循环能解决的问题,while循环也可以解决。
语法结构:
while 条件
do
循环主体
done
语法<1>
初始值
while [ 条件判断语句 ]
do
循环主体
变量变化
#这里变量变化的方式有两种,一种是((a++)),另外一种是a=`expr $a + 1`
done
示例:
语法<2>:
初始值
while ((条件判断语句))
do
循环主体
变量变化
#这里变量变化的方式有两种,一种是((a++)),另外一种是a=`expr $a + 1`
done
示例:
语法<3>:死循环(不同于for循环的地方,能解决实现不知道循环次数的问题原因所在)
while true
do
循环主体
done
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,准备公钥
- 通过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测试主机是否在线。之前插入安装和准备秘钥。