Here Document免交互
概述
是一个特殊用途的代码块,可以使管理员无需建立临时文件来构建输入信息,而是就地生产出一个文件并用作命令的标准输出,基本语法格式:
命令 <<标记
…
…
标记
特殊字符 "<<"在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的stdin,标记的选择要确保不会出现在其他地方,避免出现混淆,两个标记之间的内容被当作是一个文件并用作命令的标准输入,可以与非交互式程序和命令一起使用
注意
标记可以使用任意的合法字符
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符包括空格
开头的标记前后的空格会被省略
在Linux系统中使用wc -l 命令后面直接跟文件名就可以统计文件内有多少行内容,采用HereDocument免交互方式也可实现对行数的统计。将要统计的内容至于标记之间,直接将内容传给wc -l来统计
[root@node01 ~]$ vim wc.sh
#!/bin/bash
wc -l <<EOF
line1
line2
EOF
[root@node01 ~]$ bash wc.sh
2
Here Document免交互
通过read命令输出并打印
[root@node01 ~]$ vim read.sh
#!/bin/bash
read i<<EOF
Hi
EOF
echo $i
[root@node01 ~]$ bash read.sh
Hi
通过passwd给用户设置密码
[root@node01 ~]$ vim passwd.sh
#!/bin/bash
passwd zhangsan<<EOF
123456
123456
EOF
[root@node01 ~]$ bash passwd.sh
更改用户 zhangsan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
变量设定
如果写入内容中包含变量,在写入文件时要先将被变量替换成实际值在,再结合cat命令完成写入
[root@node01 ~]$ vim here
#!/bin/bash
doc_file="2019.txt"
i=company
cat > $doc_file <<HERE
Take him from home to $i
HERE
[root@node01 ~]$ bash here
[root@node01 ~]$ cat 2019.txt
Take him from home to company
除了变量替换,还可以用来进行变量的设定。Here Document不光可以将标记内容传给命令来执行,还可以给整体赋值给一个变量,然后通过echo命令将变量值打印出来
[root@node01 ~]$ cat here
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<HERE
Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here
Take him from home to Great!Beautyful!
格式控制
关闭变量替换功能
就是希望按照字符原本的样子输出,不做任何修改或替换
[root@node01 ~]$ vim here
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<'HERE'
Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here
Take him from home to $i
去掉每行之前的TAB字符
在本示例的标记内,每行都有一个TAB字符,在第一行的标记前面加“-”,这个表示要抑制各行首TAB的作用
[root@node01 ~]$ vim here
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<-'HERE'
Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here
Take him from home to $i
多行注释
语法格式如下
: << DO-NOTHING第一行注释第二行注释……DO-NOTHING
上述语法结构中“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被 bash 忽略掉,因此可达到批量注释的效果。
expect免交互
安装
需要先配置本地yum仓库,然后通过yum安装expect即可
yum -y install expect
基本命令介绍
1.脚本解释器
expect 脚本中首先引入文件,表明使用的是哪一个 shell。
#!/usr/bin/expect
2.expect/send
expect命令用来判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由 spawn 启动的进程的输出。
expect 接收命令执行后的输出,然后和期望字符串匹配,若匹配成功则执行相应的 send 向进程发送字符串,用于模拟用户的输入。Send 发送的命令不能自动回车换行,一般 要加\r(回车)。其常见语法形式有以下三种
expect "$case1" {send "$respond1\r"}
expect "$case1"
send "$response1\r"
expect
{
"$case1" {send "$response1\r"}
"$case2" {send "$response2\r"}
"$case3" {send "$response3\r"}
}
3.spawn
后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息,语法如下
spawn Linux执行命令
4.结束符
expect eof:等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了
interact:执行完成后保持交互状态, 把控制权交给控制台,这时可以手动输入信息。 需要注意的是,expect eof 与 interact 只能二选一。
5.set(以秒为单位)
set timeout 30
6.exp_continue
表示允许expect继续向下执行命令
7.send_user
表示回显命令,相当于echo
8.接收参数
expect 脚本可以接受从 bash 传递的参数,使用[lindex $argv n]获得。其中 n 从 0 开始, 分别表示第一个,第二个,第三个....参数。
参数存在 argv 中,使用第一个参数如下:
set param0 [lindex $argv 0]
¥argc表示参数个数,判断语句如下
if {$argc< 1} {
#do something
send_user "usage: $argv0 <param1><param2> ... " exit
}
在上述脚本中,$argv0 是脚本名,但[lindex $argv 0]是第一个参数 param1, [lindex $argv 1]是第二个参数 param2, 以此类推。send_user 用来显示信息到父进程(一般为用户 的 shell)的标准输出。
expect语法
单一分支语法
用于简单的用户交互,当监控名雷电输出满足expect指定的字符串时,向标注输出发送send指定的字符串,默认情况下send不会向标准输入发送空格所有需要\r手动换行
expect "password:" {send "mypassword\r“;}
多分支模式语法
多分支用于复杂的用户交互,一般情况下输出内容可能有多个,根据不同的输出内容, 分别向标准输入发送不同的内容。其语法格式如下所示
expect
}
"aaa" {send "AAA\r"}
"bbb" {send "BBB\r"}
"ccc" {send "CCC\r"}
}
除了上述的多分支结构之外,还有另外一种多分支结构,具体使用方法如下所示。 exp_continue 表示继续后面的匹配,假如配了 aaa,执行完 send 语句后还要继续向下匹配 bbb。
expect
{ "aaa" {send “AAA”;exp_continue}
"bbb" {send “BBB”;exp_continue }
"ccc" {send "CCC"}
}
执行方式
直接执行
./direct.sh [参数] #需要为文件添加允许权限
嵌入执行
将 expect 过程融入 Shell 当中