一、here document免交互
——对文本内容进行操作
(1)格式:
命令 <<标记
内容
标记
注意事项:
1、标记可以使用任意的合法字符。合法字符指字母和数字,一般不使用特殊符号;常以字母开头EOF
2、结尾标记一定要顶格写,且在结尾标记前不能有任何字符,空格也不行
3、开头标记前一般没有任何字符。开头标记可以加空格,但会被自动省略cat
命令 | 含义 | 格式 |
cat | 对文件内容进行免交互操作 | cat <<EOF>文件名 内容 EOF |
tee | 本身具有标准输出的作用,可以直接把文件内容输入到文件中 | tee 文件名 <<EOF 内容 EOF |
(2)cat
赋值单个变量
赋值整体变量
(3)tee
赋值单个变量
赋值整体变量
二、expect免交互
——解决shell脚本中的交互问题
注意事项:
1、需要安装expect
2、必须声明注释器 #!/usr/bin/expect
3、必须赋权执行
chmod 777 test.sh
./test.sh ./opt/test.sh .sh
(1)常用的转义字符
\n 换行(回车键)
\t 制表符(tab键)
\r 回车
\b 退格符(backspace键)
(2)格式
spawn声明命令。后面一般都是linux命令,表示开启会话或者进程,跟踪后续的交互信息
expect 捕获命令相关的内容、字符串匹配
send 发送指令,模拟用户的输入
结束符:
expect eof 交互结束。等待执行结束,退回到原来的用户(默认等待时间是10s)—退回之前的终端
interact 交互结束。执行完成之后保持状态,把控制权交给控制端,停留在目标终端,不会退回原终端
格式1 | spawn 命令 expect “捕获匹配的内容” {send "用户输入的内容\r"} expect eof |
格式2 | spawn 命令 expect “捕获匹配的内容” send "用户输入的内容\r" expect eof |
格式3 | spawn 命令 expect { “捕获匹配的内容1” {send "用户输入的内容\r"} “捕获匹配的内容2” {send "用户输入的内容\r"} “捕获匹配的内容3” {send "用户输入的内容\r"} “捕获匹配的内容4” {send "用户输入的内容\r"} } expect eof |
三、set定义变量或设置参数
(1)格式
set hostname [ lindex $argv 0 ]
相当于hostname=$1 #位置变量
set passwd [ lindex $argv 1 ]
相当于passwd=$2 #位置变量
exp_continue和expect捕获命令结合起来一起使用,附加在expect的判断项。匹配到expect的捕获内容之后,还能继续判断expect捕获语句中的其他选项
格式:
expect {
“connecting (yes/no)?” {send “yes\r”;exp_continue;}
}
(2)send_user
send_user回显命令,跟echo一样,打印内容
1、免交互实现用户修改密码
2、传参方式实现修改密码
四、嵌入式执行模式
—将expect免交互过程和shell结合起来
涉及到终端切换的方式不建议使用嵌入式执行。例如:ssh或su
不需要交互的命令可以放在expect外面执行
例题:使用免交互的方式实现硬盘分区、格式化、挂载、挂载目录也要创建好