shell 循环

版权声明:请随意转载 https://blog.csdn.net/cheng1804/article/details/82595138

for

语法结构:
for    变量名      [ in 取值列表 ]
do
循环体
done

如何解决for的默认空格分割的问题。使用IFS=$’\n’  重新定义分隔符。
另外,如果脚本中还有for怎么办呢?储存变量,还原变量
OLD_IFS=$IFS
IFS=$'\n'
IFS=$OLD_IFS

while和until

循环次数不[一定]是固定的
语法结构:
while语句结构(死循环/逐行处理文件)
while 条件测试
do
    循环体
done
==当条件测试成立(条件测试为真),执行循环体

until与while相反

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

循环总结

固定(空格分隔):for
逐行:while
逐行/不固定循环次数:while until
中断语句
      - 1.continue:中断本次循环,继续下一次循环
      - 2.break:中断整个循环,可使用break2跳出2层循环
      - 3.exit:退出程序
      - 4.shift 使位置参数向左移动,默认移动1位,可以使用shift 2

except

解决shell 交互问题
- 1.安装
yum install -y expect tcl tclx tcl-devel
- 2.基本使用

#!/usr/bin/expect
spawn ssh root@192.168.0.111    //spawn  expect 内部命令,启动一个shell程序。

expect {            //expect 期望哪些内容
        "yes/no" { send "yes\r";exp_continue }  //出现yes/no  就send发送 yes ,\r  表示回车 ,exp_continue 继续下一条语句。
        "password:" { send "666666\r" };  //出现password 就send发送 centos
}
interact             //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 "centos\r" }
}
expect eof
EOF
        fi
        }&
done
wait
echo "finishi..."

根据用户自定义名,密码,创建的数量。循环创建用户。

#!/bin/bash
while :
do

#读取用户输入的名,密,数量
read -p "please enter prefix & pass & num[xu 123 1]:" prefix pass num
#打印菜单
printf "user infomation:
--------------
user prefix:$prefix
user passwd:$pass
user number:$num
--------------
"
#邀请用户确认
read -p "are you sure?[yes/no/quit]:" action
if [ "$action" = "yes" ];then
        break           ##跳出循环
elif [  "$action" = "quit"   ];then
    exit 99
else
    continue
fi
done
echo "create user start"
#seq -w是等长的意思
#调动循环创建用户
for i in `seq -w $num`
do
user=$prefix$i
id $user &> /dev/null
if [ $? -eq 0 ];then
        echo "user $user already exists"
else
        useradd $user
        echo "$pass" | passwd --stdin $user &> /dev/null
        if [ $? -eq 0 ];then
                echo "$user is created."
        fi
fi
done

双网关自动切换

#!/bin/bash
gw1=192.168.10.253
gw2=192.168.10.251
(
while :      //条件恒真,进入死循环
do
        route del default
        route add default gw $gw1     //删除默认网关,并设gw1为默认网关。这两个命令主要是为了第二个循环结束后进行的操作
        while ping -c 1 $gw1 &> /dev/null //测试能否ping通主网关。while循环是测试条件成立会继续循环,即继续ping下去
                do
                        sleep 1   //ping成功会休眠一秒
                done              //ping不通结束循环
        route del default
        route add default gw $gw2   //第一个循环结束后进行的操作,删除默认网关,并将gw2设为默认网关
        until ping -c 1 $gw1 &> /dev/null  //进入第二个循环继续ping主网关。until循环是测试条件不成立会继续循环,即ping不通继续ping
                do
                        sleep 1
                done  //ping通了就结束循环,又重新进入死循环进行的操作。就是删除默认网关,并gw1为默认网关
done
) &  //将脚本里的命令加入后台执行

猜你喜欢

转载自blog.csdn.net/cheng1804/article/details/82595138