巴什赫里多克

2023-11-06

在编写 shell 脚本时,您可能会遇到需要将多行文本或代码块传递给交互式命令的情况,例如tee , cat, or sftp .

在 Bash 和 Zsh 等其他 shell 中,Here 文档 (Heredoc) 是一种重定向类型,允许您将多行输入传递给命令。

编写 HereDoc 的语法采用以下形式:

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER
  • The first line starts with an optional command followed by the special redirection operator << and the delimiting identifier.
    • 您可以使用任何字符串作为分隔标识符,最常用的是 EOF 或 END。
    • 如果分隔标识符未加引号,则 shell 将在将此处文档行传递给命令之前替换所有变量、命令和特殊字符。
    • 将减号附加到重定向运算符<<-,将导致所有前导制表符被忽略。这允许您在 shell 脚本中编写此处文档时使用缩进。不允许使用前导空格字符,只能使用制表符。
  • Here-document 块可以包含字符串、变量、命令和任何其他类型的输入。
  • 最后一行以定界标识符结尾。分隔符前面不允许有空格。

基本定理示例#

在本节中,我们将了解如何使用heredoc的一些基本示例。

Heredoc 最常与猫命令 .

在下面的示例中,我们传递两行包含环境变量和一个命令cat使用此处的文档。

cat << EOF
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

从下面的输出中可以看到,变量和命令输出都被替换了:

The current working directory is: /home/linuxize
You are logged in as: linuxize

让我们看看如果将分隔符用单引号或双引号引起来会发生什么。

cat <<- "EOF"
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

您可以注意到,当分隔符被引用时,shell 不会完成参数扩展和命令替换。

The current working directory is: $PWD
You are logged in as: $(whoami)

如果您在语句或循环中使用heredoc,请使用<<-重定向操作允许您缩进代码。

if true; then
    cat <<- EOF
    Line with a leading tab.
    EOF
fi
Line with a leading tab.

您可以使用以下命令将输出重定向到文件,而不是在屏幕上显示输出>, >>运营商。

cat << EOF > file.txt
The current working directory is: $PWD
You are logged in as: $(whoami)
EOF

如果 file.txt 不存在,则会创建它。使用时>该文件将被覆盖,同时>>会将输出附加到文件中。

Heredoc 输入也可以通过管道传输。在以下示例中sed命令将替换所有实例l字符与e:

cat <<'EOF' |  sed 's/l/e/g'
Hello
World
EOF
Heeeo
Wored

要将管道数据写入文件:

cat <<'EOF' |  sed 's/l/e/g' > file.txt
Hello
World
EOF

将 Heredoc 与 SSH 结合使用#

使用 Heredoc 是在远程系统上执行多个命令的最方便、最简单的方法之一SSH .

使用不带引号的分隔符时,请确保转义所有变量、命令和特殊字符,否则它们将在本地进行插值:

ssh -T user@host.com << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF
The current local working directory is: /home/linuxize
The current remote working directory is: /home/user

您可能还想设置一个基于 SSH 密钥的身份验证无需输入密码即可连接到您的 Linux 服务器。

结论#

在本指南中,您已经了解了什么是heredoc以及如何在 shell 脚本中使用它。

如果您有任何问题或反馈,请随时发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

巴什赫里多克 的相关文章

随机推荐

  • 编写一个 Python 程序以从函数返回多个值

    Python 是一种流行的编程语言 广泛用于开发各种应用程序 Python 脱颖而出的功能之一是它能够从函数返回多个值 这一功能使开发人员能够创建返回多个值的函数 从而更轻松地处理复杂的数据结构并提高代码可读性 在本文中 我们将讨论如何从
  • Git 恢复:功能和实际示例

    在流行的版本控制系统 Git 提供的众多命令中 git Restore 是全球开发人员的重要命令 它作为新的实验命令在 Git 2 23 中引入 已广泛用于丢弃工作目录和暂存区域中的更改 它被视为其他命令 例如 git checkout 和
  • 如何在 Debian 上安装 Maven

    Apache Maven 是一个软件项目管理和理解工具 Maven 可以通过中央信息来管理项目的构建 报告和文档 本教程将帮助您在 Debian 11 Debian 10 Debian 9 和 Debian 8 系统上安装 Apache M
  • 比较 Apache MPM Worker 和 Prefork:哪一个最适合您的应用程序

    Apache 多处理模块 MPM 是 Apache HTTP 服务器的重要组件 因为它们控制服务器的进程管理并确定服务器如何处理多个请求 有多种不同类型的 Apache MPM 可用 包括 Prefork 和 Worker 在本文中 我们将
  • 如何使用 Let’s Encrypt SSL 保护 GitLab 服务器

    我们总是说 安全第一 确保您的辛勤工作免受黑客攻击应该是首要任务 本教程将花费几分钟时间使用 Let s Encrypt SSL 证书来保护 Gitlab 服务器 Let s Encrypt 提供免费的 SSL 证书来保护您的域 并提供一种
  • 如何在 Python 中访问环境变量

    环境变量是任何编程环境的一个重要方面 它们存储配置设置 系统路径和应用程序依赖的其他基本数据 作为一名 Python 开发人员 了解如何访问和管理这些变量对于创建健壮 适应性强且可维护的应用程序至关重要 在这份综合指南中 我们将探讨 Pyt
  • 如何在 Ubuntu 18.04 和 16.04 LTS 上使用 Let’s Encrypt 保护 Nginx

    本教程将帮助您在 Ubuntu 系统上安装 Let s encrypt 客户端 并为 Nginx Web 服务器上运行的域颁发 SSL 证书 Apache 与 Let s Encrypt SSL 手动设置 Let s Encrypt SSL
  • Linux 中的 Pwd 命令(当前工作目录)

    在本文中 我们将向您展示如何使用pwd命令 当前工作目录是什么 当前工作目录是用户当前正在其中工作的目录 每次与命令提示符交互时 您都是在一个目录中工作 默认情况下 当您登录 Linux 系统时 当前工作目录将设置为您的主目录 要更改工作目
  • 如何在 Vim / Vi 中撤消和重做

    有时 在编辑文件时 您可能会删除错误的行或改变对编辑的想法 并且您会想要恢复更改 本文介绍了如何在 Vim Vi 中撤消和重做更改 Vi 或 Vim 默认安装在 macOS 和几乎所有 Linux 发行版上 当您遇到您最喜欢的编辑器不可用的
  • Linux 中如何统计目录中的文件数

    虽然不是很常见 但有时您需要找出给定目录中有多少个文件 例如 如果您用完inodes在 Linux 系统上 您需要查找哪个目录包含数千或数百万个文件 在本文中 我们将向您展示几种在 Linux 中查找目录中文件数量的不同方法 计算目录中的文
  • 如何在 Debian 10 Linux 上安装 MongoDB

    MongoDB 是一个免费的开源文档数据库 它属于 NoSQL 数据库家族 与 MySQL 和 PostgreSQL 等传统的基于表的 SQL 数据库不同 在 MongoDB 中 数据存储在灵活的 类似 JSON字段可能因文档而异的文档 它
  • 如何在 Ubuntu 18.04 上安装和配置 Redmine

    Redmine 是最流行的开源项目管理和问题跟踪软件工具之一 它是跨平台和跨数据库的 构建在 Ruby on Rails 框架之上 Redmine包括对多个项目 wiki 问题跟踪系统 论坛 日历 电子邮件通知等的支持 本教程介绍如何在 U
  • 如何在 CentOS 8 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种客户端 服务器网络协议 允许用户与远程计算机传输文件 有许多可用于 Linux 的开源 FTP 服务器 最流行和最常用的服务器是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在 Cen
  • 如何在 Ubuntu 20.04 上制作 Minecraft 服务器

    我的世界 是有史以来最受欢迎的游戏之一 这是一款沙盒视频游戏 玩家可以探索无限的世界并建造不同的结构 从简单的房屋到高耸的摩天大楼 本教程介绍如何在 Ubuntu 20 04 上创建 Minecraft 服务器 我们将使用 Systemd
  • 如何通过 SSH 隧道连接 MySQL

    默认情况下 MySQL 服务器仅侦听本地主机 这意味着它只能由同一主机上运行的应用程序访问 但是 在某些情况下 您可能希望从远程位置连接到服务器 一种选择是配置MySQL服务器允许远程连接 但这需要管理权限 并且可能会导致安全风险 更安全的
  • Bash 数组

    数组是最常用和基本的数据结构之一 您可以将数组视为一个变量 其中可以存储多个变量 在本文中 我们将介绍 Bash 数组 并解释如何在 Bash 脚本中使用它们 Bash 数组 Bash 支持一维数字索引和关联数组类型 数值数组使用整数引用
  • 如何在 Debian 10 上设置 Apache 虚拟主机

    Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根 包含网站文件的目录 为每个站点创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Debian 10 服务器上设置 Apache 虚拟
  • 配置 Apache 错误和访问日志

    Apache 是一个开源 跨平台的 HTTP 服务器 它具有许多强大的功能 可以通过各种模块进行扩展 管理时Apache对于 Web 服务器 您将执行的最常见的任务之一是检查日志文件 了解如何配置和读取日志在排除服务器或应用程序问题时非常有
  • 如何在 Ubuntu 20.04 上设置 SSH 密钥

    Secure Shell SSH 是一种用于在客户端和服务器之间创建安全连接的网络协议 通过 SSH 您可以在远程计算机上运行命令 创建隧道 转发端口等 SSH 支持多种身份验证机制 最常见的两种是基于密码和公钥的身份验证 使用公钥进行认证
  • 巴什赫里多克

    在编写 shell 脚本时 您可能会遇到需要将多行文本或代码块传递给交互式命令的情况 例如tee cat or sftp 在 Bash 和 Zsh 等其他 shell 中 Here 文档 Heredoc 是一种重定向类型 允许您将多行输入传