shell免交互
一.Here Document
使用I/O重定向的方式将命令列表提供给交互式程序
标准输入的一种替代品
1.用法
命令 << 标记
交互所需输入内容
标记
例:read a <<EOF (指定交互输入的a变量的值)
hello
EOF
echo $a (输出a)
hello (a变量的值)
1.使用注意事项
1.标记可以使用任意合法字符
2.结尾的标记一定要顶格写,前面不能有任何字符
3.结尾标记后面也不能有任何字符
4.开头标记前后的空格会被自动省略掉
二.Here Document免交互
1.通过read命令接收输入并打印
例子:[]vi a.txt
#!/bin/bash
#免交互
read i <<T
HELLO!
T
echo $i
[]chmod +x a.txt
[]./a.txt
HELLO!
三.变量设定
1.变量替换
[]vi replace.sh
#!/bin/bash
#查看内容,重定向给一个文件
doc-file="2020.txt"
i="company"
cat > doc-file <<EOF //重定向给文件doc-file
Take him from home to $i
EOF
[]chmod +x replace.sh
[]./replace.sh
[]cat 2020.txt
Take him from home to company
2.变量设定
#!/bin/bash
#变量赋值
var = dog
A=$( cat<<EOF
i an DLZ
i have a
$var
EOF
)
echo $A
四.Here Document格式控制
1.关闭变量替换
开头标记加单引号
无法在命令内引用变量
例:a=123
cat > aa.txt <<'EOF'
456
$a
EOF
[]cat aa.txt
456
2.抑制行首的TAB作用
在开头标记前加-
此时开头标记前不能有空格
例:cat <<-'EOF'
123456
EOF
##此时123456内容前的tab操作自动去除
五.多行注释
: << DO-NOTHING
注释内容1
注释内容2
注释内容3
...
DO-NOTHING
## 这段内容不会被输出
六.Expect工具
建立在tcl上的一个工具
用于进行自动化控制和测试
解决shell脚本交互相关的问题
1.工具安装
可在yum本地源直接安装
yum -y install expect
2.基本命令
expect:判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn启动的进程输出,用于接收命令执行后的输出,然后和期望的字符串匹配
send:向进程发送字符串,用于模拟用户输入,该命令不能自动使用回车,可在字符串后加\n或\r表示回车
spawn:启动进程,并跟踪后续交互信息
expect eof:结束符,等待执行结束
interact:结束符,执行完成后保持交互状态,把控制权交给控制台(如远程登录操作使用)
set:设置超时时间,过期则继续执行后续指令,单位为秒,参数timeout -1为永不超时,默认为10秒
exp_continue:允许expect继续向下执行命令,使前后命令为整体
send_user:回显命令,相当于echo
log_user 1:记录日志
log_file:指定记录日志文件
3.接受参数
Expect脚本可以接收从bash传递的参数
使用[lindex $argv n]获得(n表示位置变量,从0开始,0为第一个)
4.用法
4.1单一分支语法
expect "passwd:"{send "mypassword\r"}
4.2多分支语法
语法一:
expect "aaa"{send "aaa\r"}
expect "bbb"{send "bbb\r"}
expect "ccc"{send "ccc\r"}
语法二:
expect {
"aaa"{send "aaa\r"}
"bbb"{send "bbb\r"}
"ccc"{send "ccc\r"}
语法三:
expect {
"aaa"{send "aaa\r";exp_continue}
"bbb"{send "bbb\r";exp_continue}
"ccc"{send "ccc\r"}
}
##执行a、b无论是否有问题,不会退出,会继续向下执行
4.3直接执行
#!/usr/bin/expect ##使用expect命令写文本
set timeout 30 ##超时时间30秒
log_file test.log ##日志文件路径
log_user 1 ##记录日志
set hostname [lindex $argv 0] ##定义变量为执行脚本位置变量的$1
set password [lindex $argv 1]
spawn ssh root@$hostname ##启动进程
expect { ##捕捉交互信息并输入
"(yes/no)"
{send "yes\r"; exp_continue}
"password:"
{send "$password\r"}
}
interact ##保持交互状态结束符
4.4嵌入执行
#!/bin/bash
hostname=$1
password=$2
/usr/bin/expect<<-EOF ##Expect命令内容开始标志
spawn ssh root@$hostname
expect {
"(yes/no)"
{send "yes\r";exp_continue}
"*password:"
{send "$password\r";}
}
expect "*]#"
send "exit\r"
expect eof
EOF ===>Expect命令内容结束标志