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
) & //将脚本里的命令加入后台执行