Shell编程之免交互

一、Here Document免交互

1.1 Here Document概述

        Here Document是一个特殊用途的代码块,是标准输入的一种替代品,可以脚本开发员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输出。它的基本语法结构如下:

命令 << 开始标记

...

...

...

结束标记

#标记建议写为EOF,开始结束标记要相同。

特殊字符"<<"在标记和命令之前,目的是将命令块的输出重定向到程序或命令的stdin。两个标记之间的内容被当作一个文件并用作“命令”的标准输入。Here Document也可以与非交互式程序和命令一起使用。

        在实际使用过程中,有几点需要注意:

  • 标记可以使用任意的合法字符;
  • 结尾的标记一定要放在行的最前面,前后不能有任何字符;
  • 开头的标记前后的空格会被省略掉。

1.2 Here Document免交互

        在编写Shell脚本时使用Here Document可以实现免交互。具体实例如下所示。

        1. 通过read命令接收输入并打印

        通常使用read命令接收用户的输入,通过here Document可以将开始标记和结束标记之间的部分作为read命令接收的输入,传递给read命令,这就实现了模拟用户的输入。例如:

#!/bin/bash
read i <<EOF
HI
EOF
echo $i

#执行此脚本就会将两个EOF中间的HI作为用户的输入传递给read命令。

        2. 通过passwd给用户设置密码

        可以使用here document的方式通过passwd命令给fkk用户设置密码。示例如下;

#!/bin/bash
passwd fkk <<EOF
this_is_password
this_is_password
EOF

1.3 Here Document变量设定

        如果想要将一些内容写入文件,除了常规的方法外。也可以使用Here Document。如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,再结合cat命令完成写入。

#!/bin/bash
doc_file="2200.txt"
i="company"
cat > $doc_file <<EOF
Take him from home to $i
EOF

#cat命令获取到Take him from home to $i,并将这串字符写入到doc_file文件中

         除了变量替换,还可以使用Here Document来进行变量的设定。例如:

this is Line1.That are Sun,Moon and Stars.

1.4 Here Document格式控制

        Here Document支持两种控制输出格式的类型:关闭变量替换的功能与去掉每行之前的TAB字符。

        关闭变量替换的功能指在开始标记和结束标记之间使用的变量,不会使用变量值,而是使用变量名。例如上面中的"$ivar",不关闭变量替换会引用ivar的变量值,关闭之后myvar的值就会变为:this is Line1.That are Sun,Moon and Stars.$ivar。

        去掉每行之前的TAB字符指去掉开始标记和结束标记中字符串中的TAB字符。

        注意时注意在要用单引号标记开始标记,在启用去掉每行之前的TAB字符功能时,要在开始标记前加"-"。

1.5 Here Document多行注释

        通过Here Document可以解决了多行注释的问题,其语法格式如下:

: << 开始标记

...

#要执行的命令

...

结束标记

通过此方法,中间标记区域的内容不会被执行,因此可达到批量注释的效果。

二、expect免交互

2.1 expect概述

        expect是建立在tcl语言基础上的一个工具,它可以让一些需要交互的任务自动化地完成,相当于模拟了用户和命令行的交互操作。注意在使用expect之前需要先进行安装。

2.2 基本命令介绍

        1. 脚本解释器

        expect脚本中首先引入文件,表明使用的是哪一个shell,就像指定bash解释器一样。

#!/usr/bin/expect

        2. expect/send        

        expect命令用来判断上次输出结果里是否包含指定的字符串,如果有就立即返回,否则就等待超时时间后返回。expect只能捕捉由sspawn启动的进程的输出

        send向进程发送字符串,用于模拟用户的输入。Send发送的命令不能自动回车换行,一般要加\r。其常见语法形式有以下三种:

1.单一分支语法1

expect "$case1" {send "$respond1\r"}

2.单一分支语法2

expect "$case1"

send "$response1\r"

3.多分支模式语法

expect

{

        "$case1" {send “$reponse1\r”} 

        "$case2" {send “$reponse2\r”}

        "$case3" {send "$reponse3\r"}

}

上面的结构中,$case代表检测命令的输出结果,如果输出内容和$case保持一致,就可以通过send模拟用户的输入。

        3. spawn

        spawn后面跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息,其语法为:

spawn linux执行命令

        4. 结束符

  • expect eof: 等待执行结束,若没有这一句,可能导致命令还没执行,脚本就结束了。

  • interact:执行完成后保持交互状态,把控制权交给控制台,这时可以手动输入信息。     

        5. set

        expect 默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。例如执行以下命令即可将超时时间设置为30秒。

set timeout 30

        6. exp_continue

        exp_continue表示允许expect继续向下执行指令。

        7. send_user

        send user表示回显命令,相当于echo。

        8. 接收参数

        expect脚本可以接受从bash传递的参数,使用[lindex $argvn]获得。其中n从0开始,分别表示第一个,第二个,第三个....参数。

可以通过以下格式在指定expect解释器的脚本中给变量赋值:
set param0 [lindex $argv 0]

        单独使用$argv可以表示参数的个数。 

2.3 expect执行方式

        1. 直接执行

        在脚本中指定解释为为/usr/bin/expect就可以直接在脚本中使用expect中的命令。

        2. 嵌入执行

        上面讲到的直接执行的方式需要expect命令去执行脚本,在编写Shell脚本的时候需要去调用 expect脚本,使用不灵活。这种情况下,可以采用嵌入执行模式,将expect过程融入Shell当中,方便执行和处理。

        示例:

2.4 expect示例

        1. 创建用户并设置密码

        2. ssh远程自动登录

        3. 实现ftp的自动登录过程

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值