05 Shell编程之免交互

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.mzph.cn/bicheng/36262.shtml

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

相关文章

力扣503

题目 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&#xff0c;这意味…

vue-主题切换

themeName/index.vue页面: <template><div class"theme-view"><div click"themeClick" class"theme-btn">切换颜色</div><br>{{themeName white ? 白色 : 深色}}主题页面</div> </template><sc…

Spring Boot中最佳实践:数据源配置详解

Spring Boot中最佳实践&#xff1a;数据源配置详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…

po文件并转换成mo文件

po文件转换成mo文件 简介 .po和.mo文件是WordPress中语言相关的两种文件。po 是Portable Object(可移植对象)的缩写&#xff0c;存放待翻译的字符串信息&#xff0c;可直接用文本编辑器打开编辑&#xff1b;mo 是Machine Object的缩写&#xff0c;二进制文件&#xff0c;程序…

PHP框架中的模型:核心组件解析

引言 PHP框架作为现代Web开发的强大工具&#xff0c;极大地提高了开发效率和应用质量。在众多PHP框架中&#xff0c;模型&#xff08;Model&#xff09;扮演着至关重要的角色。本文将深入探讨模型在PHP框架中的作用、重要性以及它如何与其他组件协同工作。 什么是模型&#x…

1.3.1 离散周期信号DFS

目录 离散周期序列的DFS表示 离散周期信号DFS的性质 线性特性 位移特性 对称特性 奇偶对称 共轭反转对称 实序列的对称特性 周期卷积 DFS——Discrete Fourier Series 傅里叶级数 离散周期序列的DFS表示 做题得到的小公式 离散周期信号DFS的性质 线性特性 位…

Android-悬浮窗口

在Android系统中&#xff0c;如果应用需要弹出一个悬浮窗口&#xff0c;就需要申请一项特殊权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>在Android O之前的系统中申请了该权限后&#xff0c;再给对应的window设置 WindowM…

郭子威:未来香港楼市多方拉动稳健前行

今年2月&#xff0c;香港取消了实行14年的楼市“辣招”。“撤辣”之后&#xff0c;香港楼市迎来迅速反弹&#xff0c;3月一手房成交量环比涨逾10倍。 香港“撤辣”的背景是什么&#xff1f;撤辣之后对楼市的长远影响有哪些&#xff1f;未来香港楼市的表现将会如何&#xff1f; …

马蹄集 oj赛(双周赛第二十九次)

目录 供水管线 附庸的附庸 逆序 队列安排 管理通讯簿 调整队伍 泡泡 一元多项式的加法 约瑟夫环 暧昧团 快排变形 采蜜 供水管线 难度:钻石● 时间限制:1秒巴: 占用内存:128 M 在几个城市之间原本要规划修建许多条下水管道&#xff0c;管理人员发现这些管道会形成一…

KubeCon 香港:移动云与云猿生联合议题《在没有专用 Operator 的情况下管理数据库集群》

KubeCon CloudNativeCon 开源峰会 AI_dev 中国大会将于 2024 年 8 月 21 日至 23 日在香港举行。来自全球的云原生技术专家与爱好者在这里相会&#xff0c;探讨云原生领域的技术创新与最佳实践。此外&#xff0c;本次 KubeCon CloudNativeCon 和开源峰会将与 AI_dev&#x…

前端特殊字符数据,后端接收产生错乱,前后端都需要处理

前端&#xff1a; const data {createTime: "2024-06-11 09:58:59",id: "1800346960914579456",merchantId: "1793930010750218240",mode: "DEPOSIT",channelCode: "if(amount > 50){iugu2pay;} else if(amount < 10){iu…

【日常记录】【JS】SSE 流式传输 ChatGPT 的网络传输模式

文章目录 1、SSE 流式传输2、后端代码3、前端代码5、SSE和WS 对比6、chatgpt SSE的服务端返回的数据参考链接 单工通信是一种单向的通信方式&#xff0c;其中信息只能从发送端传输到接收端&#xff0c;而接收端不能向发送端发送任何信息。在Web开发中&#xff0c;Server-Sent E…

Unity把日志打印到屏幕上

在Unity中&#xff0c;如果你想要在屏幕上直接显示日志信息&#xff0c;而不仅仅是在控制台输出&#xff0c;你可以使用Unity的GUI系统来实现。下面是一个简单的示例&#xff0c;展示如何在Unity游戏中实时显示日志信息。 1、创建一个新的C#脚本&#xff1a; 在Unity编辑器中…

Elasticsearch 分析查询性能

一、引言 Elasticsearch作为一个分布式、多节点的搜索引擎和分析工具&#xff0c;提供了实时、可扩展、高性能的搜索和分析功能。然而&#xff0c;随着数据量的不断增长和查询复杂性的增加&#xff0c;如何分析和优化Elasticsearch的查询性能成为了一个重要的问题。本文将介绍…

计算机等级考试-Java考试大纲

二级Java语言程序设计考试大纲 【基本要求】 &#xff11;&#xff0e;掌握 &#xff2a;&#xff41;&#xff56;&#xff41; 语言的特点、实现机制和体系结构。 &#xff12;&#xff0e;掌握 &#xff2a;&#xff41;&#xff56;&#xff41; 语言中面向对象的特性。…

CP AUTOSAR标准之IPDUMultiplexer(AUTOSAR_CP_SWS_IPDUMultiplexer)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块I-PDU多路复用器IpduM的功能、API和配置。   PDU复用是指使用PDU(协议数据单元)的相同PCI(协议控制信息)和其SDU(服务数据单元)的多个唯一布局。选择器字段是复用PDU的SDU的一部分。它用于区分复用PDU的内容。   目前,人…

Zabbix对接Elasticsearch(ES)数据库(未成功)

0.需求分析 不管zabbix的后端数据库是oracle还是mysql&#xff0c;当zabbix监控的量级达到了一定程度后&#xff0c;那么对数据库的性能是一个非常严峻的挑战。特别是对历史数据的查询&#xff0c;将会变得非常非常的慢&#xff0c;别告诉我可以建索引优化&#xff0c;当量级达…

图解ReentrantLock的基石AQS-独占锁的获取与释放

大家好&#xff0c;我是呼噜噜&#xff0c;我们之前聊过Java中以互斥同步的方式保证线程安全&#xff1a;Sychronized&#xff0c;这次我们来再聊聊另一种互斥同步的方式Lock&#xff0c;本文会介绍ReentrantLock及其它的基石AQS的源码解析&#xff0c;一个非常重要的同步框架 …

驾驭巨龙:Perl中大型文本文件的处理艺术

驾驭巨龙&#xff1a;Perl中大型文本文件的处理艺术 Perl&#xff0c;这门被亲切称为“实用提取和报告语言”的编程语言&#xff0c;自从诞生之日起&#xff0c;就以其卓越的文本处理能力闻名于世。在面对庞大的文本文件时&#xff0c;Perl的强大功能更是得到了充分的体现。本…

【数据结构与算法】哈希表 详解

开放定址哈希表的存储结构是什么样的&#xff1f; 开放定址哈希表的存储结构&#xff1a; #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1int hashsize[] {997, /*...*/}; // 哈希表容量递增表&#xff0c;一个合适的素数序列typedef struct {ElemType *elem;…