Shell编程之免交互

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 当中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAID技术迭代、原理对比、产品梳理(HCIA)

目录 一、RAID技术迭代 传统RAID LUN虚拟化2.0 工作原理&#xff1a; 块虚拟化2.0 为什么有RAID2.0&#xff1f; RAID2.0实现原理&#xff1a; RAID-TPRAID 7 华为RAID-TP技术 RAID的4种工作状态 RAID算法 普通RAID算法 华为动态RAID算法 保险箱盘&#xff08;存掉…

零基础学会asp.net做AI大模型网站/小程序之四:实战初体验(简单网站教学--静态网页制作)

关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 博主在互联网大厂深耕近二十年,从一线码农做起,到人工智能公司副总裁。希望把过往经验总结出来,帮助到更多同学。有兴趣可关注博主后加个人微信(平台规定文章…

四川汇聚荣聚荣科技有限公司在市场评价好吗?

随着科技行业的迅猛发展&#xff0c;越来越多的科技公司如雨后春笋般涌现&#xff0c;其中不乏一些优秀的企业。四川汇聚荣聚荣科技有限公司便是其中的一员。那么&#xff0c;这家公司在市场上的评价如何呢?接下来&#xff0c;我们将从四个方面进行详细的阐述。 一、公司概况四…

对未知程序所创建的 PDF 文档的折叠书签层级全展开导致丢签的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级&#xff0c;提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6&#xff0c;先提取后回挂 2、PdgCntEditor 载入后&#xff0c;直接保存…

AWS中国峰会2024 半日游

亚马逊云科技中国峰会于2024年5月29-30日在上海举办 今年就去了半天&#xff0c;去年也是去过的&#xff0c;不过今年的活动个人感觉比去年略微凌乱了一点。 今年的峰会方向和去年一致&#xff0c;均是AI方向的各项内容&#xff08;基础架构、安全、服务、游戏、驾驶、各行各…

移动电商服务器单点部署

知识图谱 任务一&#xff1a;Web服务器部署 1.知识结构 2.WEB服务器的介绍 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上提供某种特定类型计算机的程序&#xff0c;Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件&#xff0c;让全世界…

day25-XML

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

Linux下CPU1000%记一次挖矿病毒清理流程

今天top后发现一个进程CPU高1795%&#xff0c;判断是病毒 查找进程ps -elf|grep 进程idpid和ppid查找到sleep进程 ps -ef|grep 4277 查看具体进程内容&#xff0c;ll /proc/进程idpid ll /proc/4277 ls -l /proc/{pid号} ls -l /proc/{pid号}/exe kill掉病毒进程 排查病毒…

leetcode 72. 编辑距离

. - 力扣&#xff08;LeetCode&#xff09; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word…

springboot+vue 社区养老服务系统

Springbootvue社区居家养老服务系统&#xff0c;数据库mysql&#xff0c;mybatis框架&#xff0c;有可视化页面。 功能&#xff1a; 用户管理 养老服务管理 护理人员管理 服务类型管理 健康状况管理 社区管理 服务区管理 娱乐资讯管理 咨询分类管理 反馈建议 系统简历管理 轮播…

opencv-python(一)

1. 图片加载与显示 import cv2 import numpy as npif __name__"__main__":rose cv2.imread(./rose.jpeg)print(rose.shape)print(type(rose))cv2.imshow(rose,rose) # 弹出窗口cv2.waitKey() # 等待键盘输入&#xff0c;任意输入&#xff0c;触发这行代码&#xff…

开源硬件初识——Orange Pi AIpro(8T)

开源硬件初识——Orange Pi AIpro&#xff08;8T&#xff09; 大抵是因为缘&#xff0c;妙不可言地就有了这么一块儿新一代AI开发板&#xff0c;乐于接触新鲜玩意儿的小火苗噌一下就燃了起来。 还没等拿到硬件&#xff0c;就已经开始在Orange Pi AIpro 官网上查阅起资料&…

【简单介绍下Milvus,什么是Milvus?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

ROS无人机追踪小车项目开发实战 | 第四届中国智能汽车创新大会圆满结束

2024年5月26日&#xff0c;阿木实验室在深圳第四届中国智能汽车创新大会上&#xff0c;开展的《Prometheus开源平台-ROS无人机追踪小车项目开发实战课》圆满结束。 该实战课从初学者的角度出发&#xff0c;通过实践性讲解和开发&#xff0c;使开发者们系统地学习了硬件系统架构…

基于Whisper+SparkAI+Pyttsx3实现全流程免费的语音交互

实现前后端语音交互的Demo 在现代Web应用中,语音交互越来越受到关注。它不仅能提升用户体验,还能为特定人群提供更多便利。本文将介绍如何实现一个前后端语音交互的Demo,涵盖音频录制、语音识别、语言模型生成回复和语音合成等步骤。 文章目录 实现前后端语音交互的Demo一.…

【html】用html模拟微信布局

您做的这个模拟微信布局的作品很不错,使用了Flexbox布局来实现元素的灵活排列。以下是关于您代码的一些分析和建议: 效果图: 代码分析: 全局样式重置: 您使用了* { margin: 0; padding: 0; }来重置所有元素的边距。这是一个常见的做法,可以避免不同浏览器默认样式的差…

特征融合篇 | YOLOv8 引入动态上采样模块 | 超过了其他上采样器

1. 介绍 本篇介绍了一种将动态上采样模块引入 YOLOv8 目标检测算法的新方法&#xff0c;该方法在 COCO 数据集上获得了 55.7% 的 mAP&#xff0c;超越了其他上采样器。该方法将动态上采样模块引入到 YOLOv8 的特征融合阶段&#xff0c;能够根据输入图像的特征分辨率动态调整上…

js四舍五入和计算精度问题处理

js四舍五入和计算精度问题处理 目录 js四舍五入和计算精度问题处理错误计算方法示例代码 js中加减乘除&#xff0c;部分数据会存在计算不准确。 错误计算 我使用的是big.js&#xff0c;基于big.js库封装了下工具方法&#xff0c;当然也可以用其他库&#xff0c;如mathjs/bignu…

找回xmind文件办法:一切意外均可找回(误删/重启关机等)

我周三编辑完&#xff0c;周四下午评审完用例忘记保存 结果到了快乐星期五&#xff0c;由于是周五我太开心了...早上到公司后觉得电脑卡&#xff0c;直接点了重启啥都没保存啊啊啊啊啊 准备上传测试用例时才想起来我的用例找不见了&#xff01;&#xff01;&#xff01;&…

oracle sys无法远程访问问题解决

/myweb/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora sys的默认密码是manager&#xff0c;system的默认密码是change_on_install&#xff0c;为什么使用默认密码都无法正常登录呢&#xff1f;这就很奇怪了 解决&#xff1a; Winr——->Cmd——->输…