Linux Heredoc教程

here文档,又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell和程式语言里定义一个字串的方法

3 min read
By myfreax
Linux Heredoc教程

here文档,又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell和程式语言里定义一个字串的方法。

它可以保存文字里面的换行或是缩进等空白字符。一些语言允许在字串里执行变量替换和命令替换。

当编写shell脚本,你可能在某些情况下,你需要将文本或代码的传递给交互式命令,如teecatsftp

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

[COMMAND] <<[-] 'DELIMITER'
  HERE-DOCUMENT
DELIMITER

这是HereDoc的语法采用的形式。第一行开头的命令COMMAND是可选的,后跟特殊操作符<<和定界符DELIMITER

您可以使用任何字符串作为定界符DELIMITER,最常用的是EOF或END。

<<后面加上减号-将使所有前导制表符被忽略。这使您可以在shell程序脚本时编写内容时使用缩进。不允许使用前导空格字符,只能使用制表符。

HERE-DOCUMENT可以包含字符串,变量,命令和任何其他类型的输入。最后一行以定界标识符结尾。分隔符前面不允许有空格。

Heredoc示例

在本节中,我们将介绍一些如何使用heredoc的基本示例。Heredoc最常与cat命令结合使用。

在下面的示例中,我们传递了两行文本,其中包含一个环境变量whoami命令来使用heredoc。

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

从输出中可以看到,变量和命令输出都被替换。让我们看看如果将定界符括在单引号或双引号中会发生什么。

您会注意到,当用引号引起来时,shell不会进行任何参数扩展和命令替换。

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

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

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

您可以使用>>>运算符将输出重定向到文件,而不是在屏幕上显示输出。

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

SSH使用heredoc

使用Heredoc是通过SSH在远程系统上执行多个命令的最便捷的方法。

使用不带引号的定界符时,请确保转义所有变量,命令和特殊字符,否则它们将在本地被解释,进行命令,变量的替换操作。

您可能还需要设置基于SSH密钥无密码登录并连接到Linux服务器。

ssh -T [email protected] << EOF
echo "The current local working directory is: $PWD"
echo "The current remote working directory is: \$PWD"
EOF

结论

在本教程中,您了解了什么是heredoc。以及如何在shell程序脚本中使用它。如果您有任何问题或反馈,请随时发表评论。