Bash Heredoc 多行文本传递
评论 0
浏览 0
2019-05-10
在编写 shell 脚本时,您可能会遇到需要将多行文本或代码块传递给交互式命令的情况,例如 tee
、cat
或 sftp
。
在 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 脚本中使用它。
如果您有任何问题或反馈,请随时发表评论。
0 个评论