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