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.mzph.cn/web/13144.shtml

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

相关文章

Spring数据访问全攻略:从JdbcTemplate到声明式事务

上文讲到 —— 航向数据之海&#xff1a;Spring的JPA与Hibernate秘籍 本文目录 四. JdbcTemplate的使用定义JdbcTemplate及其在Spring中的作用展示如何使用JdbcTemplate简化数据库操作1. 配置JdbcTemplate2. 使用JdbcTemplate查询数据3. 打印查询结果 五. Spring的事务管理介绍…

Linux shell编程学习笔记49:strings命令

0 前言 在使用Linux的过程中&#xff0c;有时我们需要在obj文件或二进制文件中查找可打印的字符串&#xff0c;那么可以strings命令。 1. strings命令 的功能、格式和选项说明 我们可以使用命令 strings --help 来查看strings命令的帮助信息。 pupleEndurer bash ~ $ strin…

在k8s中搭建elasticsearch高可用集群,并对数据进行持久化存储

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、k8s简介 二、环境准备 …

Git项目管理——提交项目和版本回退(二)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

android绘制多个黑竖线条

本文实例为大家分享了android绘制多个黑竖线条展示的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 1.写一个LinearLayout的布局&#xff0c;将宽度写成5dp将高度写成match_parent. 2.在写一个类继承LinearLayout&#xff0c;用LayoutInflater实现子布局的在这个L…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源码 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

三.使用HashiCorp Vault工具管理数据库

三.ubuntu安装使用HashiCorp Vault工具管理数据库 HashiCorp Vault 是一个基于身份的秘密和加密管理系统。机密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。Vault 提供由身份验证和授权方法门控的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

深度优先搜索汇总

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09; posterity&#xff0c;英语单词&#xff0c;主要用作名词&#xff0c;作名词时译为“子孙&#xff0c;后裔&#xff1b;后代”。 什么是深度优先搜索 深度优先搜索&#xff0c;D…

文心一言指令

文心一言 文心一言&#xff08;ERNIE Bot&#xff09;是百度公司研发的知识增强大语言模型&#xff0c;它可以根据用户的指令和输入&#xff0c;生成相应的回答或文本。以下是一些可能的指令示例&#xff0c;用于指导文心一言完成不同的任务&#xff1a; 知识问答&#xff1a…

【oracle】图片转为字节、base64编码等形式批量插入oracle数据库并查询

1.熟悉、梳理、总结下Oracle相关知识体系 2.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 资源下载&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3个资源文件资源下载&#xff1a; Instant Client Setup.exe资源下载&#xff1a; oci.dll、oraocci11.dll、oraoc…

初识C语言——第二十一天

猜数字小游戏的实现&#xff1a; 学会了之后可以自己制作彩票抽奖&#xff0c;哈哈&#xff01; 代码实现&#xff1a; #include <stdlib.h> #include <time.h>void menu()//无返回值函数 {printf("**************************\n");printf("****…

云原生 初识Kubernetes的理论基础

一、k8s 的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#x…

利用远程控制软件FinalShell远程连接虚拟机上的Linux系统(Windows)

一. VMware Workstation 安装CentOS Linux操作系统 传送门&#xff1a;VMware Workstation 安装CentOS Linux操作系统 1.右键打开终端 2.输入ifconfig 找到ens33对应 inet的id&#xff0c;这个就是虚拟机的ip地址图中所示为&#xff1a;192.168.5.128 3.打开finalshell 如…

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…

【刷题篇】二分查找(二)

文章目录 1、山脉数组的峰顶索引2、寻找峰值3、寻找旋转排序数组中的最小值4、LCR 点名 1、山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] &l…

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…

css笔记总结2

找到所有的 h1 标签。 选择器&#xff08;选对人&#xff09; 设置这些标签的样式&#xff0c;比如颜色为红色&#xff08;做对事&#xff09;。 ##css基础选择器 基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器&#xff1a; 标签…

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

KNN算法处理多元分类任务

概述 这个案例还是基于之前的案例进行改造。 之前的案例代码完整如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn…

Java获取请求参数

1.简单参数接收 前端请求参数与Controller接受变量名一致 如果参数名不一致&#xff0c;接受不成功。 可以用RequestParam指定参数名&#xff0c;可以用username接收&#xff08;不推荐&#xff09;。 required true&#xff0c;表示参数必须传递&#xff0c;如果不传递会报错…