Shell编程之免交互

时间:2024-06-01 07:34:12

Here Document免交互

概述

是一个特殊用途的代码块,可以使管理员无需建立临时文件来构建输入信息,而是就地生产出一个文件并用作命令的标准输出,基本语法格式:

命令 <<标记

标记

特殊字符 "<<"在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的stdin,标记的选择要确保不会出现在其他地方,避免出现混淆,两个标记之间的内容被当作是一个文件并用作命令的标准输入,可以与非交互式程序和命令一起使用

注意

标记可以使用任意的合法字符

结尾的标记一定要顶格写,前面不能有任何字符

结尾的标记后面也不能有任何字符包括空格

开头的标记前后的空格会被省略

在Linux系统中使用wc -l 命令后面直接跟文件名就可以统计文件内有多少行内容,采用HereDocument免交互方式也可实现对行数的统计。将要统计的内容至于标记之间,直接将内容传给wc -l来统计

[root@node01 ~]$ vim wc.sh 
#!/bin/bash
wc -l <<EOF
line1
line2
EOF
[root@node01 ~]$ bash wc.sh 
2

Here Document免交互

通过read命令输出并打印

[root@node01 ~]$ vim read.sh 
#!/bin/bash
read i<<EOF
Hi
EOF
echo $i
[root@node01 ~]$ bash read.sh 
Hi

通过passwd给用户设置密码

[root@node01 ~]$ vim passwd.sh 
#!/bin/bash
passwd zhangsan<<EOF
123456
123456
EOF
[root@node01 ~]$ bash passwd.sh 
更改用户 zhangsan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

变量设定

如果写入内容中包含变量,在写入文件时要先将被变量替换成实际值在,再结合cat命令完成写入

[root@node01 ~]$ vim here
#!/bin/bash
doc_file="2019.txt"
i=company
cat > $doc_file <<HERE
Take him from home to $i
HERE
[root@node01 ~]$ bash here
[root@node01 ~]$ cat 2019.txt 
Take him from home to company

除了变量替换,还可以用来进行变量的设定。Here Document不光可以将标记内容传给命令来执行,还可以给整体赋值给一个变量,然后通过echo命令将变量值打印出来

[root@node01 ~]$ cat here 
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<HERE
Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here 
Take him from home to Great!Beautyful!

格式控制

关闭变量替换功能

就是希望按照字符原本的样子输出,不做任何修改或替换

[root@node01 ~]$ vim here 
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<'HERE'
Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here 
Take him from home to $i

去掉每行之前的TAB字符

在本示例的标记内,每行都有一个TAB字符,在第一行的标记前面加“-”,这个表示要抑制各行首TAB的作用

[root@node01 ~]$ vim here
#!/bin/bash
doc_file="2019.txt"
i="Great!Beautyful!"
myvar=$(cat<<-'HERE'
	Take him from home to $i
HERE
)
echo $myvar
[root@node01 ~]$ bash here 
Take him from home to $i

 多行注释

语法格式如下

: << DO-NOTHING
第一行注释
第二行注释
……

DO-NOTHING

上述语法结构中“:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被 bash 忽略掉,因此可达到批量注释的效果。

expect免交互

安装

需要先配置本地yum仓库,然后通过yum安装expect即可

yum -y install expect

基本命令介绍

1.脚本解释器

expect 脚本中首先引入文件,表明使用的是哪一个 shell

#!/usr/bin/expect

2.expect/send

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

expect 接收命令执行后的输出,然后和期望字符串匹配,若匹配成功则执行相应的 send 向进程发送字符串,用于模拟用户的输入。Send 发送的命令不能自动回车换行,一般 要加\r(回车)。其常见语法形式有以下三种

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

expect "$case1"

send "$response1\r"

expect

{

"$case1" {send "$response1\r"}

"$case2" {send "$response2\r"}

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

}

3.spawn

后面通常跟一个命令,表示开启一个会话、启动进程,并跟踪后续交互信息,语法如下

spawn Linux执行命令

4.结束符

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

interact:执行完成后保持交互状态, 把控制权交给控制台,这时可以手动输入信息。 需要注意的是,expect eof interact 只能二选一。

5.set(以秒为单位)

set timeout 30

6.exp_continue

表示允许expect继续向下执行命令

7.send_user

表示回显命令,相当于echo

8.接收参数

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

参数存在 argv 中,使用第一个参数如下:

 set param0 [lindex $argv 0]

 ¥argc表示参数个数,判断语句如下

if {$argc< 1} {
#do something
send_user "usage: $argv0 <param1><param2> ... " exit
}

在上述脚本中,$argv0 是脚本名,但[lindex $argv 0]是第一个参数 param1, [lindex $argv 1]是第二个参数 param2, 以此类推。send_user 用来显示信息到父进程(一般为用户 的 shell)的标准输出。

expect语法

单一分支语法

用于简单的用户交互,当监控名雷电输出满足expect指定的字符串时,向标注输出发送send指定的字符串,默认情况下send不会向标准输入发送空格所有需要\r手动换行

expect "password:" {send "mypassword\r“;}

多分支模式语法

多分支用于复杂的用户交互,一般情况下输出内容可能有多个,根据不同的输出内容, 分别向标准输入发送不同的内容。其语法格式如下所示

expect
}
"aaa" {send "AAA\r"} 
"bbb" {send "BBB\r"} 
"ccc" {send "CCC\r"}
}

除了上述的多分支结构之外,还有另外一种多分支结构,具体使用方法如下所示。 exp_continue 表示继续后面的匹配,假如配了 aaa,执行完 send 语句后还要继续向下匹配 bbb。

expect
{ "aaa" {send “AAA”;exp_continue} 
"bbb" {send “BBB”;exp_continue } 
"ccc" {send "CCC"}
}

执行方式

直接执行

expect 命令
./direct.sh [参数]       #需要为文件添加允许权限

嵌入执行       

将 expect 过程融入 Shell 当中