使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp,cat或read命令。
是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个"文件"并用作“命令"的标准输入。Here Document也可以与非交互式程序和命令一起使用
标记可以使用任意合法字符(通常为EOF)
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略掉
注意:read只能读取一行内容
#!/bin/bash
file="EOF1.txt"
i="school"
cat > $file <<EOF
I am going to $i
EOF
#!/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"
建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
expect eof
interact
执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了, interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。
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执行报错
#!/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
原文:https://www.cnblogs.com/Rui-Lin/p/15066554.html