Here Doucument的作用和格式
Here Document的作用:
- 使用I/O重定向的方式将命令列表提供给交互式程 序
- 标准输入的一种替代
-
语法格式: 命令 <<开始标记 ....................... ...................... 结尾标记
注意:
-
标记可以使用任意合法字符,但开始标记与结尾标记需要保持一致。(常用标记EOF,使用其他字母也可以) 结尾的标记一定要顶格写,前面不能有任何字符结尾的标记后面也不能有任何字符(包括空行)开头标记前后的空格会被省略掉
二.Here Document的运用
1.read 命令的读取
[root@localhost jiaohu]#read a <<EOF
> this is a test
> hello world
> EOF
[root@localhost jiaohu]#echo $a
[root@localhost jiaohu]#read a <<jiewei
> this is a test2
> jiewei
[root@localhost jiaohu]#echo $a
对于read命令来说,只会读取第一行的内容,所以输出也只能输出第一行内容。
案例:读取qwer888
2.wc -l 的内容行数统计
[root@localhost jiaohu]#wc -l <<EOF
> aaaaa
> bbbbb
> ccccc
> ddddd
> eeeee
> ddddd
> EOF
3.passwd用户密码的修改
[root@localhost jiaohu]#passwd <<EOF
> 123456
> 123456
> EOF
两次密码一次设置一次确认密码
4.cat 查看内容以及免交互输入内容至文件
[root@localhost jiaohu]#cat <<EOF
> my name is zhuyuze
> hello world
> EOF
5.tee命令重定向输出加标准输出
[root@localhost jiaohu]#tee test2.txt <<EOF
> this is tee test
> EOF
this is tee test
[root@localhost jiaohu]#cat test2.txt
tee命令有标准输出的作用,配合运用,可以将重定向输出的内容直接导入文件中。
三.Here Document 变量的使用
Here Document也支持变量的使用,如果标记之间有变量被使用,会先替换变量值。如果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document
如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,再结合cat命令完成输出
1.交互内容中输出变量的操作
#!/bin/bash
var="this is test1"
var1=$(cat <<EOF
this is test2
this is test3
$var
EOF
)
echo "$var1" #变量存在时一定要加双引号
输出结果:
2.交互内容中不输出变量操作
#!/bin/bash
var="this is test1"
var1=$(cat <<'EOF' #不想在免交互内容重输出变量值可以在开始标记加入单引号
this is test2
this is test3
$var
EOF
)
echo "$var1"
四.Expect实现免交互运用
Expect使用的基本方法:
1.脚本解释器的声明
expect 脚本中首先引入文件,表明使用的是哪一个 shell
2.spawn 启动进程并捕捉交互信息
spawn 后面通常跟一个 Linux 执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息
3.expect 从进程接收字符串
判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回
4.send 用于向进程发送字符串
向进程发送字符串,用于模拟用户的输入
该命令不能自动回车换行,一般要加\r (回车)或者\n
5.结束符(expect eof 与 interact 只能二选一)
1)expect eof : 表示交互结束,等待执行结束,退回到原用户,与spawn对应。
比如切换到root用户,expect脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户
2)interact :执行完后保持交互状态,把控制权交给控制台会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用。。
fdisk分区操作
脚本编写:
#!/usr/bin/expect #脚本解释器的声明
set timeout 5
set name [lindex $argv 0] #脚本重第一个传递的全部参数
spawn fdisk $name #spawn 启动进程并捕捉交互信息
expect "获取帮助" #从进程接收字符串
send "n\r" #用于向进程发送字符串
expect "Select"
send "p\r"
expect "分区号"
send "\r"
expect "起始"
send "\r"
expect "Last"
send "+10G\r"
expect "命令"
send "w\r"
interact #结束符(expect eof 与 interact 只能二选一)