第三章 循环
脚本调用脚本
例如:# 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