结构
Here Document免交互
Here Document常规用法
Expect基本命令
Expect执行方式
Expect案例
免交互
Here Document免交互
使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp,cat或read命令。
是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个"文件"并用作“命令"的标准输入。Here Document也可以与非交互式程序和命令一起使用
语法格式:
注意事项:
标记可以使用任意合法字符(通常为EOF)
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略掉
免交互方式实现对行数的统计,将要统计的内容置于标记"EOF"之间,直接将内容传给wc -l来统计
通过read命令接收输入并打印,输入值是两个EOF标记之间的部分,作为变量i的值
注意:read只能读取一行内容
通过passwd给用户设置密码
通过cat和重定向符号输出文件
tee 相当于cat 重定向输入
支持变量替换
在写入文件时会先将变量替换成实际值,再结合cat命令完成写入
#!/bin/bash
file="EOF1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF
整体赋值给变量,然后通过echo命令将变量值打印出来
#!/bin/bash
var="Great! I am going to school! "
myvar=$(cat <<EOF
This is Line 1.
Today is Monday.
$var
EOF
)
echo "$myvar"
关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换
对标记加单引号,即可关闭变量替换
#!/bin/bash
var="Great! I am going to school! "
myvar=$(cat <<‘EOF‘
This is Line 1.
Today is Monday.
$var
EOF
)
echo $myvar
多行注释
Bash的默认注释是"#",该注释方法只支持单行注释; Here Document的引入解决了多行注释的问题。
":"代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。
#!/bin/bash
var="Great! I am going to school! "
: << EOF
This is Line 1.
Today is Monday.
$var
EOF
echo "abcd"
Expect
建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
基本命令:
(1)脚本解释器
(2) spawn
(3) expect
(4) send
(5)结束符
expect eof
interact
执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了, interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
(6) set
(7) exp_continue
exp_continue附加于某个expect判断项之后,可以使该项被匹配后,还能继续匹配该expect
判断语句内的其他项。exp_continue类似于控制语句中的continue语句。表示允许expect继续向下执行指令。
例如: 下例将判断交互输出中是否存在yes/no或*password。如果匹配yes/no则输出yes并再次执行判断;如果匹配*password则输出abc123并结束该段expect语句。
注意:使用exp continue时,如果跟踪像passwd这样的输入密码后就结束进程的命令, expect{}外不要再加上expect eof因为spawn进程结束后会默认向expect发送eof,会导致后面的expect eof执行报错
(8) send_user
(9)接收参数
Expect案例
#!/usr/bin/expect
#设置超时时间 set timeout 5
#参数传入 set hostname [lindex $argv 0] set password [lindex $argv 1]
#开始追踪命令 spawn ssh $hostname expect { "No route to host" exit "Connection refused" exit "(yes/no)" {send "yes\n";exp_continue} "password:" {send "abc1234\n"} }
#把控制权交给控制台 interact