05 Shell编程之免交互

news2024/10/7 18:20:05

1、Here Document免交互

1.1 Here Document概述

Here Document是一个特殊用途的代码块,它是标准输入的一种替代品,

可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。

Here Document有一个非常重要的标识叫EOF——文件结束符号

即在使用Here Document实现免交互操作一个系统或文件的时候,需要借助EOF这个文件结束符号,来标志着你文件内容的开始与结束。

补充:

向左指的箭头——写入的意思,把内容写入到指定的文件里面。

>表示覆盖了原有的内容

>>表示在原有内容追加的意思

注:Here Document的基本语法格式为:

特殊字符<<在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的stdin;

标记的选择要确保不会出现在其他地方,以避免出现混淆;

两个标记之间的内容被当作是一个文件并用作命令的标准输入;

Here Document也可以与非交互式程序和命令一起使用。

补充:在实际使用过程中,要注意:标记可以使用任意的合法字符;

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

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

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

在Linux中系统中,使用wc-l命令后面直接跟文件名就可以统计文件内有多少行内容。

而采用Here Document免交互方式也可以实现对行数的统计,如下图所示:

1.2 Here Document免交互

通过Here Document可以将一些简单的交互任务的交互过程去除掉,尤其是在编写脚本的过程中。

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

通常使用read命令接收用户的输入值时会有交互过程,尤其是在脚本执行过程中遇到read命令,脚本会停下来等待用户输入值后才会继续。

例如,在下图中输入值是两个EOF标记之间的部分,也就是Hi,浙江作为变量i的值,在最后echo打印变量i的值,即最后会输出Hi:

执行上述脚本,输出结果如下图所示:

(2)通过passwd给用户设置密码

例如,通过passwd命令给jerry用户设置密码时,为避免重复交互,可使用Here Document的方式:

注:上图中,EOF标记之间的两行是输入的密码和确认密码,两行内容必须保持一致,否则密码设置不成功。

此脚本执行后不会输出任何信息,可打开另一个终端使用jerry用户登录,输入新修改的密码来验证是否修改正确。

1.3 Here Document变量设定

Here Document也支持使用变量,如果标记之间有变量被使用,会先替换变量值。

注:如果想要将一些内容写入文件,除了常规的方法外,也可以使用Here Document。

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

在上图的执行过程中,标记内变量i的值被替换成了company,最终结果输出到$doc_file内,其值为2019.txt。

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

在上图中,$ivar先进行了替换,之后再转向输出,交由cat显示出来,其结果放置到$()中,最后得到上述结果。

1.4 Here Document格式控制

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

(1)关闭变量替换的功能

关闭变量替换的功能就是希望按照字符原本的样子输出,不做任何修改或替换:

(2)去掉每行之前的TAB字符

在下图的例子中,每一行都有一个TAB字符。

注:在第1行的标记前加-,这个表示要抑制各行首TAB的作用。

1.5 Here Document多行控制

注:在Shell脚本的工作中,#右侧的任何字符串,bash都会将其忽略。

Here Document的引入解决了多行注释的问题,其语法格式如下:

在上图中,:表示什么都不做的空命令;

中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果。

下面的脚本用于演示Shell中的多行注释,开头的 Here Document标记内容不会被执行(在需要使用多行注释的时候可以采用此方法)

1.6 Here Document的应用

先用vim编辑器,打开一个aa.sh的脚本文件,然后在文件里写入下面的内容:

接着保存退出,执行一下:

若把vim编辑器里面的EOF右边的双箭头去掉一个,改成单箭头,然后执行一下,如下图:

若将vim编辑器里的EOF改成AAA,把数据中的第2行和第3行都改成191,再执行一下,如下图:

补充:这说明文件结束符EOF它仅仅是一个起始与结束的符号,至于这个符号你写成什么不重要,我们经常用EOF这三个字母,是因为EOF这三个字母它确实代表文件结束符这几个字的意思。(EOF是可以用别的词来代替的,因为它仅仅代表一个开头与结束的符号)

注意:文件结束符是可以嵌套的,正常的话,文件结束符中间应该是文本的内容,但是这些内容呢也可以再带一对文件结束符,就像引号套引号一样。

若想借助Here Document来统计文本中人名的数量,可执行下图中的命令:

补充:前面一个EOF,后面一个EOF,中间就确定了我的语句块。

所谓语句块是什么?

它是一组指令的集合,这个集合一定是被某一个控制语句所规范起来的。

使用read命令的-p选项,可以提示用户输入内容,然后把输入的内容赋值给变量name。如下图:

要求:使用read读取语句、字符串,然后把读到的内容赋值给变量。

那如果不想用上图的这种交互式界面,而想用非交互式的界面,怎么实现呢?

需要注意的是:

补充:

下面实现一种变量的替换方式:

先用vim编辑器打开一个空文件aa.sh,然后在aa.sh脚本文件里,填写下图中的内容。如下图:

上图中的EOF中间的语句块表示,写入这个文本的内容里包含一个变量,最终会把这个变量替换为对应的值,这个值是nihao。

补充:如何在vim编辑器里删除当前的所有内容?

先输入一个小写字母d,再输入一个大写字母G,整个内容就全删了。如下图:

法一:

法二:

先用vim编辑器打开一个脚本文件bb.sh,然后在里面输入下面的内容:

关于注释符的问题:

然后执行一下这个脚本可以得到如下图所示的结果:

但如果这7行中,有的若干行我不想看到,就可以在脚本中用注释符#给注释掉。那么如果说我们要注释掉的行数有很多(几十行甚至是上百行),也需要这样加很多的#吗?

那就可以使用Here Document进行多行注释,可以在脚本中执行下图中的命令:

然后保存并退出vim编辑器,去执行一下该脚本,如下图:

2、expect免交互

2.1 expect概述

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

注: expect是用来进行自动化控制和测试的工具,主要解决Shell脚本中不可交互的问题。

在Linux维护工作中,经常需要远程登录服务器进行操作。而登录的过程是一个交互的过程,可能会需要输入yes/no、password等信息。

为了模拟这种输入,可以使用expect脚本。

2.1.1 expect安装

Linux系统本身并没有安装 expect和tcl,需要手动安装。

2.2 、expect的应用

tcl——工具命令语言(并不是一种特定的编程语言),tcl只是一类语言的代称,并没有明确指明是什么语言。

expect有着它自己的语法结构,它就属于tcl语言。

注:Here Document是针对文本编辑内容进行免交互的,

那么不仅仅只是针对文本内容的编辑可以免交互的,我的命令行中输入的命令也是可以用脚本去实现免交互的

例如,假如在192.168.10.101的主机上使用ssh命令远程登录到另一个主机192.168.10.103上的时候,会出现很多提示信息,要求输入登录账号密码相关的信息。如下图:

可以使用expect免交互去实现命令的免交互。

注:可以把安装的expect工具也当成一个特殊的解释器,它和bash解释器是一类的。bash解释器只不过解释的是操作系统的指令,而expect解释器解释的是expect所对应的指令。

expect所能执行的命令/解释的语句有:

(1)expect命令的功能

那么,如何让脚本自动去识别这一行是输入yes或no的呢?也就是说,如何让你的脚本去识别这行字符里有个你指定的字符或字符串?

就可以用expect去实现,expect主要是判断输出内容中,是否包含指定的字符串。

(2)send命令的功能

send是发送字符串的一个手段,命令也算字符串。

如下图,需要在提示内容后手动输入一个密码,而是要send命令可以用发送的方式给发送一个密码(也不用手动去敲了)。

(3)spawn命令的功能

可以实现开启一个会话的功能,通常在spawn后面可以跟一个系统命令。

注:任何开启一个交互式动作的命令,都可以用spawn去引出来。

平时正常的话要登录一个别的系统可以用ssh命令去登录,但是现在要交给expect免交互这个工具去读取,就可以在ssh+目标地址的前面加上一个spawn,如下图:

(4)expect eof命令和interact的功能

expect eof代表结束,而interact也代表结束。

注:这两个结束符号不能同时用,只能用其一,即不要连着用。

它们的区别在于:interact的结束只是结束了交互,不结束你的expect;

而expect eof的结束代表整个expect都结束了。

例如,要用ssh命令远程登录到一个主机上,如下图:

如果用的是interact这种方式去结束的话,意味着只是结束了ssh命令的登录交互动作,那结束交互之后停留在了远程主机的环境,就可以继续针对远程主机输入命令;

但如果说仅仅只是想实现一个免交互的动作,然后还想退回到原来的主机环境,即不再连接到102这个远程主机,那就可以用expect eof这种方式去结束,这就意味着整个expect就结束了。

案例1:如何使用expect以脚本的方式,用ssh登录远程主机?

因为当前系统里面是没有expect这个工具的,那就安装一个expect。如下图:

在bb.sh脚本里面按照下图中的填写:

然后保存退出vim编辑器,执行一下刚刚写的脚本,如下图:

注:在远程登录到主机192.168.10.100之前,要确保其是处于开机的状态。

因为刚才在脚本里面写的是interact退出方式,它的结束仅仅意味着ssh交互的结束,结束后还会停留在目标远程主机的环境上,所以此时的IP还是192.168.10.100。

但是如果此时想回到原来的主机上,可以执行一下exit指令,如下图:

但是如果要把脚本里的退出方式给换成expect eof这种退出方式的话,如下图所示:

改变过之后保存退出vim编辑器,然后再来执行一下该脚本:

注:在把退出方式换成expect eof以后,它把整个expect给退了出来,即不会再停留在目标主机100的远程环境上。

案例要求2:利用脚本登录到远程主机,在远程主机执行相应的指令,执行结束了以后,就退出远程主机的操作环境,回到当前的主机。

那根据上面的要求,直接在脚本中连接到远程主机的那一块命令之后添加相应的命令不就可以了吗?

在脚本bb.sh中按照下图编写:

然后执行一下:

改进脚本如下:

然后保存并退出vim编辑器,执行一下该脚本,如下图:

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

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

相关文章

链在一起怎么联机 链在一起远程同玩联机教程

steam中最近特别热门的多人跑酷冒险的游戏&#xff1a;《链在一起》&#xff0c;英文名称叫做Chained Together&#xff0c;在游戏中我们需要开始自己的旅程&#xff0c;在地狱的深处&#xff0c;与我们的同伴被链在一起。我们的任务是通过尽可能高的攀登逃离地狱。每一次跳跃都…

linux中awk,sed, grep使用(待补充)

《linux私房菜》这本书中将sed和awk一同归为行的修改这一点&#xff0c;虽然对&#xff0c;但不利于实际处理问题时的思考。因为这样的话&#xff0c;当我们实际处理问题时&#xff0c;遇到比如说统计文本打印内容时&#xff0c;我们选择sed还是awk进行处理呢&#xff1f; 也因…

2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年天津市安全员C证证模拟考试题库及天津市安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材&#xff0c;天津市安全员C证大纲整理…

联想至像M3070DNA打印机加粉及清零方法

基本参数&#xff1a; 产品类型&#xff1a;黑白激光多功能商用一体机&#xff08;打印/复印/扫描&#xff09; 网络功能&#xff1a;支持有线网络打印 最大处理幅面&#xff1a;A4 双面功能&#xff1a;自动 打印速度&#xff1a;30页/分钟&#xff08;高速激光打印&…

安卓webview内h5页面调用录音设置

h5页面调用录音接口getUserMeia在webview中有可能不成功&#xff0c;进入错误回调&#xff0c;这个时候webview尽可能设置下面这些权限就会好。

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(1)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督将为大家带来全新系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音…

Zabbix 监控系统部署

Zabbix 监控系统部署 Zabbix是一个企业级开源分布式监控解决方案&#xff0c;可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的运行状况和完整性。 Zabbix 使用灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于电子邮件的警报。这允许…

高频科技亮相SEMl-e2024第六届深圳国际半导体展,以超纯工艺推动行业发展

6月26-28日,SEMl-e2024第六届深圳国际半导体展在深圳国际会展中心(宝安新馆)隆重举办。本次展会以【“芯”中有“算”智享未来】为主题,汇聚800多家展商,集中展示了集成电路、电子元器件、第三代半导体及产业链材料和设备为一体的半导体产业链,搭建了供需精准对接、探索行业新发…

8大趋势,重塑金融服务行业

谈论“金融服务行业”就像谈论“亚洲大陆”。这是因为&#xff0c;通用行业概念但它掩盖了许多细分领域的细微差别和多样性&#xff0c;以及人们思考、工作和感受方式的巨大差异。 银行应用程序和一个量化交易公司都是金融服务公司&#xff0c;但它们的运营方式可能天壤之别。…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

Java web应用性能分析之【自定义prometheus监控指标】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

服务器出现意外情况。(Exception from HRESULT: 0x80010105(RPC E SERVERFAULT))

这种情况一般出现在excel2007版本&#xff0c;下载了什么阅读器之类的 2007改不了这个加载项&#xff0c;需要重装一个其他版本&#xff08;2010版本可以&#xff09; 然后如下操作修改为COM加载项

vue 组件下 img 标签动态传入不展示

效果 解决办法&#xff1a; require() <titleComponent:title"业务工作概览":src"require(/assets/imgs/evaluation/overviewStatistics.png)"></titleComponent> 效果&#xff1a;

CVPR 2024最佳论文分享:文本到图像生成的丰富人类反馈

CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;是计算机视觉领域最有影响力的会议之一&#xff0c;主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期&#xff0c;CVPR 2024公布了最佳论文。共有10篇论文获奖&#xff0c;其…

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件&#xff0c;主要通过钓鱼邮件打开突破口&#xff0c;收集各种信息再回传给攻击者。近期&#xff0c;研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件&#xff0c;最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

昨天在写《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候&#xff0c;正好遇到动态反射需要的类型擦除技术。所谓的类型擦除&#xff0c;就是在两个模块之间的接口层没有任何类型信息&#xff0c;实现两个模块之间安全的通信。可以理…

QT控制comboBox切换方法

目录 1. 效果2. 操作 1. 效果 如下图&#xff1a; 点击全切换雨天模式按钮 则 comboBox 文本显示为 “雨天模式”点击全切换正常模式按钮 则 comboBox 文本显示为 “雨天模式” 切换到 雨天模式 切换到 正常模式 2. 操作 使用 “setCurrentIndex” 方法&#xff0c;切换 combo…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述&#xff1a; 这个错误表明在 Bash 环境下&#xff0c;尝试执行 chkconfig 命令&#xff0c;但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具&#xff0c;通常…

[数据集][目标检测]电力场景下电柜箱门把手检测数据集VOC+YOLO格式1167张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1167 标注数量(xml文件个数)&#xff1a;1167 标注数量(txt文件个数)&#xff1a;1167 标注…