Here Doucument

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 只能二选一)

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值