Bash Heredoc 多行文本传递

评论 0 浏览 0 2019-05-10

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

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

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

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

基本定理示例

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

Heredoc 最常与 cat 命令 结合使用 。

在下面的示例中,我们传递两行包含 环境的文本变量 以及使用here 文档向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)

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

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 命令将用 e 替换 l 字符的所有实例:

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 脚本中使用它。

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

最后更新2023-09-16
0 个评论
标签