Shell脚本 <<EOF ... EOF语法(Here Document)(特殊的输入重定向方式)(定界符)

文章目录

    • Here Document语法
      • Here Document 的基本语法
      • 使用场景
    • 关于定界符
      • 定界符不是变量
      • 定界符在 Here Document 中只是一个字符串,主要功能是标记输入文本的开始和结束,使用时应遵循最佳实践格式要求
      • 例子和说明
        • 如何使用定界符
        • 定界符可重复使用,但不推荐重复使用
          • 示例说明
          • 最佳实践

Here Document语法

在 Bash 脚本中,bc <<EOF ... EOF 结构使用了一种叫做 “Here Document” 的语法。这是一种特殊的输入重定向方式,它允许您在脚本中直接内嵌一个多行的文本块,并将这个文本块作为输入传递给命令。在这种情况下,它被用来提供输入给 bc,这是一种命令行计算器。

Here Document 的基本语法

Here Document 的语法如下:

command <<DELIMITER
text
more text
DELIMITER
  • command 是需要输入的命令。
  • DELIMITER 是一个自定义的结束符,用来标记输入块的开始和结束。这个结束符可以是任意字符串,如 EOFEND 等,只要它在文本块中不会被误解为其他内容。
  • textmore text 是将会传递给 command 的输入内容。

在使用 bc 的例子中:

#!/bin/bashbc -l <<EOF
# 这里可以放入要执行的 bc 命令
a = 5
b = 3
a + b
l(2)
EOF

在这里插入图片描述

这个脚本块向 bc 传递了几个计算指令。bc 将执行这些指令并返回结果。这种方法特别适合于需要传递复杂脚本或多行命令到 bc 时使用。

使用场景

Here Document 通常用于以下情况:

  • 自动化脚本中需要交互式命令的情况。
  • 提供配置文件或脚本给命令,尤其是在内容较长或较复杂时。
  • 简化脚本书写,避免多次 echo 或复杂的输入重定向。

这种方法简化了对 bc 等接受标准输入的程序的命令输入,使脚本更易于阅读和维护。

关于定界符

定界符不是变量

在使用 Here Document (<<EOF ... EOF) 的结构时,EOF 并不一定要是一个全新的或未使用过的变量名。实际上,EOF 在这里并不作为变量使用,而是作为定界符,它的主要目的是明确地标记输入文本的开始和结束。

然而,选择一个合适的定界符确实非常重要,以避免与脚本中的其他文本混淆。这里有几个关键点需要注意:

  1. 唯一性:定界符应该是独特的,以确保它不会意外地出现在预期的输入文本中。如果定界符在文本中出现,它会被解释为 Here Document 的结束,这可能会导致脚本执行不正确。

  2. 一致性:通常使用 EOF 作为定界符,但您可以使用任何其他独特且不太可能在文本中出现的字符串,比如 END, FINISH, STOP 等。

  3. 不是变量:虽然在很多编程场景中,像 EOF 这样的词可能看起来像是变量或命令的一部分,但在 Here Document 的上下文中,它只是一个文本标记。

定界符在 Here Document 中只是一个字符串,主要功能是标记输入文本的开始和结束,使用时应遵循最佳实践格式要求

定界符在 Here Document 中只是一个字符串,它的主要功能是标记输入文本的开始和结束。使用 Here Document 时,定界符的选择有一些基本的格式要求和最佳实践:

  1. 唯一性:定界符应该是一个在所提供的文本内容中不会出现的唯一字符串。这是为了避免将部分文本内容错误地识别为定界符,导致输入提前结束。

  2. 简单性:通常建议使用简单明了的字符串作为定界符,如 EOF(End of File 的缩写)是非常常见的选择。其他常用的字符串包括 ENDFINISH 等。

  3. 无空格:定界符不应包含空格或特殊字符。它应该是一个单一的、连续的字符串,以避免解释上的错误。

  4. 大写:虽然不是必须的,但常见的约定是使用全大写字母来增加其在脚本中的可见性和区分度。

例子和说明

如何使用定界符

以下是一个使用 Here Document 的示例,演示了如何使用定界符:

#!/bin/bash# 使用 EOF 作为定界符
cat <<EOF
这是一些文本。
这里可以包括各种字符,除了定界符自身。
EOF# 使用自定义定界符
cat <<MY_END_MARKER
这里是更多的文本。
注意定界符 MY_END_MARKER 在文本中是唯一的。
MY_END_MARKER

在这里插入图片描述

在这些示例中:

  • EOFMY_END_MARKER 都被用作定界符,它们在各自的 Here Document 中唯一,因此不会与文本内容混淆。
  • 在这些例子中,文本块被直接传递给 cat 命令,它简单地输出这些文本到标准输出。

总之,选择合适的定界符是使用 Here Document 的关键部分,它确保了输入的正确传递和脚本的可读性。

定界符可重复使用,但不推荐重复使用

定界符可以在同一个脚本中重复使用,只要每次使用的上下文是清晰且独立的。在使用 Here Document 的多个实例中,您可以使用相同的定界符,比如 EOF,因为每个 Here Document 的内容是从定界符开始到下一个相同定界符结束的文本块。

每个 Here Document 是独立处理的,因此在一个脚本中多次使用相同的定界符不会引起冲突或错误,只要确保每个 Here Document 的定界符匹配正确。

示例说明

以下是一个展示在同一个脚本中多次使用同一定界符的示例:

#!/bin/bash# 第一次使用 EOF 作为定界符
cat <<EOF
1.这是一些文本。这里可以包括各种字符,除了定界符自身。EOF# 第二次使用相同的定界符 EOF
cat <<EOF
2.这是另一些文本。这里可以包括各种字符,除了定界符自身。
EOF

在这里插入图片描述

在这个脚本中,EOF 被用作两个不同的 Here Document 的定界符。每个 cat 命令将从其对应的 <<EOF 开始,直到遇到下一个 EOF 为止。这两个 Here Document 是完全独立的,因此使用相同的定界符不会造成任何问题。

最佳实践

虽然技术上可以在同一个脚本或上下文中重复使用相同的定界符,但在复杂的脚本或在有多个 Here Document 的情况下,使用不同的定界符有助于增加代码的清晰度和可读性,尤其是当 Here Document 的内容较长或逻辑较复杂时。这样做可以帮助防止混淆和错误,特别是在维护或修改脚本时。

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

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

相关文章

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介

数据分层&#xff08;应用分层&#xff09;技术简介 近几年虚拟化市场实现了非常大的发展&#xff0c;桌面虚拟化在企业中应用越来越广泛&#xff0c;其拥有的如下优点得到大量企业的青睐&#xff1a; 数据安全不落地。在虚拟化环境下面数据保存在中心服务器上面&#xff0c;…

想做好抖店?新手、老玩家切勿掉进这些坑,操作要慎重!

大家好&#xff0c;我是电商花花。 很多人都说做抖音小店不需要脑子&#xff0c;会抄就行&#xff0c;难道做店真的就是这样吗&#xff1f; 真的就是会抄&#xff0c;会简单选品&#xff0c;找一些达人就能出单&#xff0c;就能实现睡后收入了吗&#xff1f; 其实并不见得&a…

Day_5

1. Apache ECharts Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表 官网地址&#xff1a;https://echarts.apache.org/zh/index.html 入门案例 快速入门&#x…

K210开发板MicroPython开发环境搭建

一、安装CanMV IDE开发软件 1、进入如下连接 https://developer.canaan-creative.com/resource 2、点击下载 3、下一步 4、修改安装路径&#xff0c;下一步 5、接受许可下一步 6、下一步 7、安装 8、完成 9、区域①菜单栏&#xff1a;操作文件&#xff0c;使用工具等。…

短视频素材该去哪里找?分享8个短视频剪辑必备的素材大全

在短视频创作与运营中&#xff0c;素材的找寻常常成为创作者的最头疼的事&#xff0c;因为它既要求不侵犯版权&#xff0c;又追求内容的优质性。然而&#xff0c;今天我要为大家揭晓一些剪辑短视频素材库的宝藏网站&#xff0c;它们将成为你创作旅程中的得力帮手&#xff0c;让…

集群分发脚本xsync

1.环境准备 1.准备三台服务器&#xff08;我这里使用虚拟机,操作系统 CentOS7 &#xff09;它们的IP分别为 192.168.188.135、192.168.188.136、192.168.188.137 2.先将三台机器的主机名修改&#xff0c;为每台主机设置hostname&#xff08;具体名称由自己定义&#xff09;&am…

Canal解决select count(*)执行慢的问题

前言 count 的常用方式&#xff0c;使用 count(*)来统计数据条数&#xff0c;但是 innodb 没有存储数据总数&#xff0c;所以执行起来就会很慢。 可以使用 expalin sql 来返回预估行数&#xff0c;expalin select count(*)....., 通过预估的方式,统计数据条数。可以使用 redi…

双向RNN和双向LSTM

双向RNN和双向LSTM 一、双向循环神经网络BiRNN 1、为什么要用BiRNN 双向RNN&#xff0c;即可以从过去的时间点获取记忆&#xff0c;又可以从未来的时间点获取信息,也就是说具有以下两个特点&#xff1a; 捕捉前后文信息&#xff1a;传统的单向 RNN 只能利用先前的上下文信息…

Google Veo发布:AI生成视频的重大突破

在Google I/O 2024大会上&#xff0c;Google推出了Veo&#xff0c;这是一款能够根据文本提示生成1080p视频的AI模型。这次发布标志着Google在生成式AI领域的又一重大突破。 Veo的强大功能 Veo不仅能够生成各种视觉和电影风格的视频片段&#xff0c;包括风景镜头和延时摄影&am…

【计算机毕业设计】springboot房地产销售管理系统的设计与实现

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低房地产公司的运营人员成本&#xff0c;实现了房地产销售的 标准化、制度化、程序化的管理&#xff0c;有效地防止了房地产销售的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、…

如何选择开箱机厂家,看这几点!

在现代化生产线上&#xff0c;开箱机作为自动化包装设备的重要组成部分&#xff0c;其选择对于提升生产效率、降低成本至关重要。然而&#xff0c;市场上开箱机厂家众多&#xff0c;如何挑选出合适的合作伙伴成为了许多企业面临的难题。与星派一起探讨如何选择开箱机厂家&#…

Docker 安装的MySQL迁移数据库

1. 导出数据库 docker ps :查看数据库对应的 CONTAINER ID docker exec -it id /bin/bash : 进入到mysql的docker实例中 cd /usr/bin : 进入到bin目录 mysqldump -u root -p123456 study > /root/study_backup0509.sql :使用mysqldump备份库&#xff0c;注意密码与-p之间…