巴什·赫雷多克(Bash Heredoc)

在编写shell脚本时,您可能需要将多行文本或代码传递给交互式命令,例如: teecat, 要么 sftp

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

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

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

Heredoc基本示例

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

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

在下面的示例中,我们传递了两行文本,其中包含一个环境变量和一个命令以 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 [email protected] << 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脚本中使用它。

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

bash终端

Sidebar