Shell学习 | 循环
Table of Contents

for

  • 语法结构
#!bin/bash
for i in {1..10}
#for i in $(seq 1 10)
#for i in `seq 10`
do
echo "$i"
done
  • ping测试主机
#!/bin/bash
>ip.txt
>downip.txt

for i in {2..254}
do
{
ip=192.168.152.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "$ip" | tee -a ip.txt
else
echo "$ip" >> downip.txt
fi
} &
done
wait
echo "在线主机测试完毕。"
  • 通过用户列表文件创建用户

用户可以使用参数的形式,自定义用户名文件。
如果用户没有输入用户名文件,提示用户输入
如果用户输入的不是文件,提示用户更正。
启动循环创建用户
如果用户已经存在,提示存在
如果用户不存在,则创建成功,提示成功

#!/bin/bash
#name
#time
pass=123
#判断脚本是否有参数
if [ $# -eq 0 ] ;then
        echo "usage:$0 filename "
        exit 1
fi
#判断用户输入的是否是文件
if [ ! -f $1 ];then
         echo "error filename"
         exit 2
fi
#设置循环,读取文件,创建用户
for user in `cat $1`
do
         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
  • 使用for实现批量

1 邀请用户输入密码
2 循环调用IP地址
3 执行远程修改(ssh 192.168.122.20 “touch ~/ddd.txt”)
4 记录执行结果

#!/bin/bash
read -p "请输入服务器的新密码:" password
for i in $(cat ip.txt)
do
{
        ping -c1 -W1 $i &> /dev/null
        if [ $? -eq 0 ]
        then
                ssh $i "echo $password | passwd --stdin root"
                if [ $? -eq 0 ]
                        then
                        echo $i >> ok.txt
                else
                        echo $i >> fail.txt
                fi
        else
                echo $i >>no.txt
        fi
} &
done

while until

while语法结构:

while :
do
let i++
sleep 1
echo $i
done

until语法结构:

#!/bin/bash
until [[ $i -eq 14 ]]
do
let i++
sleep 1
echo $i
done

expect

交互式执行
需求:通过expect解决ssh交互问题

#!/usr/bin/expect

# spawn 启动需要交互的程序

spawn ssh root@192.168.152.133

expect {
        "yes/no" {send "yes\r";exp_continue}
        "password:" {send "123456"};
}
interact

需求:expect实战:公钥推送

  1. 通过shell循环判断在线主机
#!/bin/bash
#创建一个IP地址文件。
>ip.txt
#使用for循环ping测试主机是否在线。
for i in {2..254}
do
 {
#学员请注意练习环境的IP地址,可能与示例中不同。
 ip=192.168.0.$i
 ping -c1 -W1 $ip &> /dev/null
 if [ $? -eq 0 ];then
 echo "$ip" >> ip.txt
 fi
 }&
done
  1. 通过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..."
#!/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" }
}

for一般用于有循环次数的循环中,while和until用于不想让循环退出的循环中

上一篇
下一篇