shell(第三章循环)

第三章 循环

脚本调用脚本

例如:# vim  /tmp/a.sh
hello(){
echo "你好"
}
#vim  b.sh
 .  /tmp/a.sh
hello
sh b.sh   结果是 “你好”
循环控制

break #关键字用户跳出循环,执行后面的语句

continue #跳过当前循环中的剩余语句,直接进入下一次循环

例如:

for i in {1..10}
do
if [ $i -eq 5 ]
then
break           #关键字
fi
echo $i
done
continue   #关键字跳过当前循环中的剩余语句,直接进入下一次循环

例如:

for i in {1..10}
do
if [ $i -eq 5 ]
then
continue   #关键字
fi
echo $i
done
sleep   等待,在继续下一操作,用于脚本
例如: seelp  10  #等待10秒
for循环

echo $RANDOM #每一次输出的值都不一样

ping -c1 -W1 ip地址 -W 是停顿一秒

for  变量名  [ in   取值列表 ]
do
循环体
done
ping测试主机 案例一
循环创建10个用户
​
for i in  {1..10}    或者          for  i in $(seq 1  10)              $()   #优先执行
​
do                                do
​
useradd user$i                     useradd user$i
​
done                              done
​
0 网关地址(路由器地址)    255网络地址
​
for i in {2..254}                          do     
​
do                                         {      并发
​
ip=192.164.72.$i                           }&   并发  在会台运行  
​
ping -c1 -W1 $i                            done
​
if  [ $?  -eq  0 ];then                    wait   #等待
​
echo "$ip"                                echo "测试完毕"
​
esle 
​
echo "$ip"
​
fi
​
done

案例二:

通过用户列表文件创建用户

#!/bin/bash
for  i in   ``cat  user.txt`   `     
do
useradd   $i
echo "用户创建成功"
dine
升级
#!/bin/bash
if [ $#  -eq   0   ];then
echo "程序运行,未携带用户名文件参数 "
echo"示例 $0 文件名字"
exit 88
fi
if [ ! -f $1   ];then
echo " $1 文件名有误"
exit 66
fi
for i in``cat $1` `
do
id $i &>/dev/null
if [ $? -eq 0 ]
then
echo "$i  用户已存在不需要创建"
else 
useradd $i >/dev/null
echo "$i 用户创建完成"
fi
done
案例三
免密码登录
ssh-keygen    生成一个免密秘钥
ssh-copy-id  ip号
###### 使用for实现批量修改root的密码
#!/bin/bash 
read -p "请输入服务器新密码:" passwd
for i in $(`cat ip.txt`)            $()   #括号里面的内容优先执行
do
{
ping -c1 -W1 $i &> /dev/null
if [ $?  -eq 0   ];then
ssh $i "echo $passwd | passwd --stdin root"
else 
echo "$i" &> /dev/null
fi
}&
done
shell循环:while until
###### while
while 循环的开始向右取值可以使:    :的话右侧是空值
while  语法结构   (死循环/ 逐行处理文件)
do
循环体
done
当条件测试成立(条件测试为真),执行循环体
案例:                             可以用if来控制退出
#!/bin/bash                 sleep  1下面加上
while :                          if    [ $i   -eq   10  ];then
do                                  exit  66
let i++                             fi
sleep 1                             echo $i
echo $i
done
###### until  
until 语法结构
until  条件测试 
do
循环体
done
当条件测试成立(条件测试为假视为成立),执行循环体
案例
#!/bin/bash                           #!/bin/bash 
until [[ $i -eq 10  ]]               until    udycdscjvfd  &> /dev/null
do                                   do
let i++                              let i++
sleep 1                             sleep  1
echo $i                             echo $i
done                                done
for 可以控制循环的次数(固定)
while   until   不可控制(不固定)
可以加上for叫while   until  变成可控的脚本
expect

expect 脚本 #运行expect脚本

通过expect解决ssh交互问题

spawn是一个特殊的命令,它用于启动一个新的进程,并且这个进程是在expect控制下的 spawn主要用于处理那些需要交互式输入(如密码验证、确认提示等)的命令或程序,比如通过SSH连接远程服务器等场景

实例1
#!/bin/bash
spawn ssh root @10.9.25.5 
expect {
         "yes/no "{send"yes\r";exp_continue}    
         "password:"{send "666\r"};      #密码
}
interact   或者  expect   eof
send  #发送
expect 期望哪些内容
yes/no  就send发送 yes ,\r  表示回车
password 就send发送 centos
exp_continue,#跳过循环,就继续下一条语句   如果程序没有问直接跳过
interact #允许用户交互  ,  保留会话  停留当前的位置
interact 之后用户需要手动退出   就不能再用expect  eof  
实例2
通过expect进行交互   推送秘钥     
​
#!/bin/bash
rpm -q expect &>/dev//null
if [ $?  -ne 0   ];then
yum -y install expect
fi
if [ ! -f /root/.ssh/id_rsa  ];then
ssh-keygen  -P "" -f  /root/.ssh/id_rsa    # 生成秘钥  -P输入密码  -f 秘钥存放地
fi
​
ip.txt
for i in {2..254}
do
{ 
ip=192.168.72.$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 "1\r"};      
}
expect eof
EOF
fi
}&
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值