Shell编程-循环

1.for循环

  • ping不同的主机:
>ip.txt  # 将文件清空
for i in {1..254}
do
{
        ip=192.168.100.$i
        ping -c1 -W1 $ip &> /dev/null
        if [ $? -eq 0 ]
        then
                echo ${ip} | tee -a ip.txt  # 将能ping通的ip地址以追加的形式写入文本中
        fi
}&  # 表示后台执行
done
  • 通过用户列表文件创建用户:
for user in `cat user.txt`
do 
		useradd $user
		echo "$user is created"
done

tips:

  • $()表示优先执行括号内的命令,和反引号作用一样。${}表示引用变量
  • 在命令后面加上&表示后台执行,执行效率更快(脚本并发)
  • exit后面可以接上数字,不同的数字可以定义不同的错误信息:
# test.sh
exit 100
[root@VM-0-17-centos ~]# bash test.sh 
[root@VM-0-17-centos ~]# echo $?
100

2.while until

  • while循环:当条件为真时执行循环
a=2
while [ $a -eq 2 ]  
do
        let i++
        sleep 1
        echo $i
done
while :  # 冒号表示恒为真(和while之间要有空格)
do 
	echo "ok"
done 
  • until循环:当条件为假时执行循环
a=2
until [ $a -eq 1 ]
do
        let i++
        sleep 1
        echo $i
done

3.expect

  • 比如脚本在执行到ssh命令时,会出现交互场景(输入密码等),导致脚本的执行被中断。expect是一种语言,用来实现自动和交互式任务,它可以模拟输入进而提供程序需要的输入来实现交互程序的执行

  • 通过expect解决ssh交互问题:

    • 通过expect编写脚本:
    # ------------ssh.exp脚本------------
    #!/usr/bin/expect
    
    password=xxx
    ip=xxx
    user=xxx
    
    # spawn:启动一个需要对话的进程
    spawn ssh $user@$ip
    # expect:放置期望的内容
    expect {
            # “问题(可以是问题的一部分)” {答案}
            "yes/no" { send "yes\r"; exp_contiune }  # \r表示回车,exp_continue表示如果没出现该问题就执行下面的命令 
            "password:" { send "$password" };
    }
    # 表示允许交互,如果不加该命令,执行完上述内容后就将会退出ssh进程(不保留交互界面)
    # 如果执行完上述内容不用继续交互,可以不加该命令
    interact
    

tips:

  • 不能使用bash ssh.exp,因为使用的解释器不是shell解释器,而是/usr/bin/expect,所以需要执行chmod +x ssh.exp,再使用./ssh.exp执行(因为在脚本第一行写了#!/usr/bin/expect,所以脚本在执行时会去找该解释器,相当于执行/usr/bin/expect ssh.exp)
  • 假设要在同一个脚本既使用shell解释器,又使用expect解释器,可以使用下面的脚本:
#!/bin/bash
-----bash的脚本--------
# 方式1
/usr/bin/expect <<-EOF
# expect脚本的内容
EOF
# 方式2
/usr/bin/expect test.exp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值