Shell编程之免交互
1.Here Document免交互
使用I/O重定向的方式将命令列表提供给交互式程序
标准输入的一种替代品
命令 <<标记
...
内容 #标记之间是传入内容
...
标记
使用注意事项:
标记可以使用任意合法字符
结尾的标记一定要顶格写,前面不能有任何字符
结尾的标记后面也不能有任何字符(包括空格)
开头标记前后的空格会被省略掉
2.Here Document常规用法
(1)免交互执行命令
交互式命令 <<EOF #免交互执行命令
指定传入内容
....
EOF
(1)通过 read 命令接收输入并打印,输入值是两个 EOF 标记之间的部分,作为变量 i 的值
(2)免交互方式实现对行数的统计,将要统计的内容置于标记“EOF”之间,直接将内容传给 wc -l 来统计
(3)通过 passwd 给用户设置密码
(2)免交互创建并编辑文件内容
默认情况下EOF中间的内容支持变量的替换;如果要关闭变量的替换,开头标记要用 '' 括起来,即 <<'EOF'
如果要抑制行首的制表符空白,开头标记前要加 - ,即 <<-EOF
如果要注释多行内容,可用 : <<EOF
cat > 文件 <<EOF #免交互创建并编辑文件内容
指定文件内容
....
EOF
(1)支持变量替换
在写入文件时会先将变量替换成实际值,再结合 cat 命令完成写入
(2)整体赋值给变量,然后通过 echo 命令将变量值打印出来
(3)关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换
(4)去掉每行之前的 TAB 字符
(5)多行注释
Bash 的默认注释是“#”,该注释方法只支持单行注释;Here Document 的引入解决了多行注释的问题。
“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。
(3)tee
将标准输入复制到每个指定文件,并显示到标准输出
tee 文件 <<EOF
指定文件内容
....
EOF
3.Expect免交互
expect概述:
建立在tcl之上的一个工具
用于进行自动化控制和测试
解决shel脚本中交互相关的问题
expect安装:
yum install -y expect
4.编写expect免交互脚本步骤
(1)#先声明解释器
#!/usr/bin/expect
(2)#接收位置参数传入
set 变量名 [lindex $argv 0] #0代表执行脚本时后面跟的第一个位置参数,第二个位置参数用 1 表示,依此类推
(3)#使用 spawn 指定交互命令 开启会话跟踪
spawn fdisk /dev/sdb
(4)#使用 expect 捕获匹配交互命名的提示信息
expect "命令(输入 m 获取帮助):"
(5)#再使用 send 发送需要交互输入的字符串,结尾需要加上回车符
send "n\r"
....
#使用一个expect匹配多次:
#如果能匹配到情况1的提示信息则发送字符串1给交互进程,接着再用情况2匹配提示信息并发送字符串2给交互进程
#如果匹配不到情况1的提示信息则继续再用情况2匹配提示信息发送并字符串2给交互进程
expect {
"情况1" {send "字符串1\r"; exp_continue;}
"情况2" {send "字符串2\r"}
}
(6)#所有交互操作完成后,使用 expect eof(会返回原用户或者原终端界面)或 interact(会停留在切换的用户或者远程终端界面)结束交互会话
(7)expect eof
在shell脚本里嵌入expect免交互代码
#!/bin/bash
....
expect << EOF
spawn 命令
expect "...."
send "...\r"
EOF
(1)切换用户免交互
(2)ssh远程登录免交互
(3)免交互修改用户密码
注:(1)expect 默认的超时时间是 10 秒,通过 set 命令可以设置会话超时时间, 若不限制超时时间则应设置为-1。
(2)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 执行报错
(3)send_user
send_user 表示回显命令,相当于 echo
5.read
read: 用法:read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]