Bash Heredoc 初学者教程

使用 Bash 脚本时,您可能会遇到必须使用相同命令处理一系列输入的情况。 幸运的是,在 Bash 中有一种方法可以使用更优化的方式实现这一点 HereDoc.

HereDoc,缩写为 这里文档, 是一个输入 重定向 将多个输入传递给程序或命令的方法。 Heredoc 的概念不仅仅与 Bash 相关。 许多流行的编程语言如 Perl、Ruby、PHP 都支持 heredoc。

在本文中,我们将通过一些实际用例来了解heredoc 的语法和用法。 本文中的所有示例都创建得很简单,因此即使是新手也可以轻松理解这个概念。 让我们开始在 Bash 中使用 heredoc。

内容

  1. HereDoc 语法
  2. 在 Bash 中使用 HereDoc 打印多行字符串
  3. HereDoc中的重定向和管道
  4. HereDoc 中的制表符抑制
  5. HereDoc中的变量和命令扩展
  6. HereDoc 的多行注释
  7. 在 HereDoc 中转义特殊字符
  8. HereDoc 用例
    1. 示例 1:在脚本中以不同用户身份运行
    2. 示例 2:将 HereDoc 与数据库客户端一起使用
    3. 示例 3:使用 HereDoc 和 SSH 执行远程命令
  9. 结论

HereDoc 语法

下图说明了heredoc 的语法。

HereDoc 语法的图示

这里,

  • 命令 – 任何接受重定向的命令(cat、wc、mail 等)。
  • 重定向运算符 (<<) – HereDoc 的默认操作符是 <<. 它将代码块重定向到命令进行处理。
  • 分隔符 – 分隔符表示文档(代码块)的开始和结束。 分隔符标记可以是任何东西,但它应该是相同的。 通常你会看到 EOF 用作分隔符,表示“文件流结束”。

在 Bash 中使用 HereDoc 打印多行字符串

让我们从重定向多行字符串并将其打印到终端的简单示例开始。

cat command 接受输入流和 heredoc,您可以重定向代码块以将其打印到终端。

$ cat << EOF Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF

输出:

Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <==

看看上面的代码片段。 我有三行重定向到 cat 命令。 我在用 EOF 作为分隔符。 但是,您可以随意使用任何内容,但要保持开始和结束分隔符相同。

让我们尝试一个更简单的例子。 我将相同的三行重定向到 字数 程序。 我正在使用不同的分隔符 (BLK) 这里。

$ wc -l << BLK Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== BLK

示例输出:

3
使用 heredoc 打印多行字符串

HereDoc中的重定向和管道

您可以将输出重定向运算符与 heredoc 结合使用,并将输出重定向到文件,而不是将其打印到终端。

我使用的示例与上一节中使用的示例相同,并将输出重定向到名为 log_op.txt.

$ cat << EOF > /tmp/log_op.txt Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF

Heredoc的输出可以发送到 管道 操作员进行进一步处理。

$ cat << EOF | grep -i sla Something is wrong with the input file received for today. Contact the downstream team to get it corrected. ==> SLA MISSED <== EOF

HereDoc 中的制表符抑制

当您的代码块中有空格(制表符)并且您希望抑制它时,请使用 "-" 在重定向运算符之后。 需要注意的重要一点是,只会抑制制表符,而不是空格。

看看下面的例子。 我在前面几节中看到的同一个例子中添加了一个条件语句。 Heredoc 中的前两行是制表符 (4),第三行是间隔 (2)。

if [[ $x = "err" ]] then  cat <<- err_msg      1. Something is wrong with the input file received for today.      2. Contact the downstream team to get it corrected.    3. ==> SLA MISSED <== err_msg fi

提交代码片段后,我的输出将如下所示。

1. Something is wrong with the input file received for today. 2. Contact the downstream team to get it corrected.    3. ==> SLA MISSED <==

如您所见,第 1 行和第 2 行制表符被抑制,但在第 3 行中,由于使用了空格,因此不会被抑制。

HereDoc中的变量和命令扩展

并不是您只能在 heredoc 代码块中传递字符串。 您可以在代码块中传递用户定义的变量和环境变量并运行命令。

看看下面的例子。 在代码块中,我有一个用户定义的变量 "${AUTHOR}", 一个环境变量 "${SHELL}", 外部命令 "whoami".

提交此代码段后,将扩展变量和命令,然后将其重定向到 cat 命令。

AUTHOR="OSTechNix"  cat << EOF Author: ${AUTHOR}                  # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF

示例输出:

Author: OsTechnix Article: Bash Heredoc I am using the /bin/bash shell karthick

您可以用单引号将起始定界符括起来,以抑制代码块内的扩展。 这样,代码块中的所有内容都将被视为字符串文字。

cat << 'EOF' Author: ${AUTHOR}                  # USER DEFINED VARIABLE Article: Bash Heredoc I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF

示例输出:

Author: ${AUTHOR}             Article: Bash Heredoc I am using the ${SHELL} shell $(whoami)

HereDoc 的多行注释

您可能已经知道,Bash 不支持多行注释。 使用 heredoc,您可以通过将代码块重定向到 no-op 命令 (:)。

no-op 是 bash 内置的,它接受输入并返回退出代码零。 您可以将其视为 bash 内置 “真的” 这也退出退出代码零。

: << 'COMMENTS' Author : OStechnix Article : Bash Heredoc BashV : 5.1.4 OS : PoP!_OS COMMENTS

当心: 几乎每个文本编辑器都具有选择多行的功能,并允许您使用按键进行注释或取消注释。 最好坚持这种方法。

在 HereDoc 中转义特殊字符

代码块可能包含特殊字符。 如果你想转义特殊字符,有几种方法可以完成它。

您可以用分隔符括起来 单身的 或者 双引号 或者 前缀反斜杠 带分隔符。 这样所有的特殊字符都将被转义。

# SINGLE QUOTES ESCAPE cat << 'EOF' I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF
# DOUBLE QUOTES ESCAPE cat << "EOF" I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF
# BACKSLASH ESCAPE cat << EOF I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF

除了转义所有特殊字符,您还可以通过添加 反斜杠 在任何特殊字符之前。

cat << EOF I am using the ${SHELL} shell      # ENV VARIABLE $(whoami)                          # EXTERNAL COMMAND EOF

示例输出:

I am using the ${SHELL} shell       karthick      

HereDoc 用例

到目前为止,我们已经看到了heredoc 的核心结构及其基本用法。 现在让我们看看一些现实生活中的用例。 根据我的经验,我在使用 ssh 和数据库客户端时使用了 heredoc,我必须在其中运行一组命令。

示例 1:在脚本中以不同用户身份运行

在某些情况下,您可能希望以不同的用户身份运行代码的某些部分。 在这种情况下,您可以使用 heredoc 重定向命令以作为不同的用户运行。

看看下面的例子。 我正在将代码块重定向到 su 命令将用户切换到 “骨科” 并将创建一个名为 测试 如果它不存在。

su - ostechnix << EOF if [[ ! -f /home/ostechnix/test ]];then  touch /home/ostechnix/test  echo "File Created" else  echo "File exists" fi EOF
HereDoc与不同的用户HereDoc与不同的用户

示例 2:将 HereDoc 与数据库客户端一起使用

当你想对数据库运行一系列命令时,heredoc 会派上用场。

看看下面的例子。 我正在与 MongoDB 客户端交互 蒙戈什 在 heredoc 中,传递代码块命令以创建新的数据库、集合和添加示例文档。

mongosh << EOF use ostechnix db.data.insertOne({     "Site" : "OsTechnix",     "DB"  : "Mongo" }) db.data.find().pretty() EOF
HereDoc 与 MongoDB 客户端HereDoc 与 MongoDB 客户端

您可能了解也可能不了解 MongoDB,但这很好。 这只是为了展示如何使用 heredoc 与 db 客户端交互。 您可以使用任何数据库客户端,如 MySQL、psql、sqlite,具体取决于您使用的数据库。

示例 3:使用 HereDoc 和 SSH 执行远程命令

当您希望在远程服务器上运行命令时,您可以结合使用 heredoc ssh 命令。 通常使用 ssh 命令,您可以通过以下方式在远程服务器中运行命令。

$ ssh [email protected] "command"

如果您希望在远程主机中运行更多命令,则必须一次又一次地重复相同的命令。 使用 heredoc,您可以将所有命令分组并运行它们。

$ ssh -T [email protected] << EOF Command 1... Command 2.. ..... Command N.. EOF

当需要跨多个节点执行相同的代码时,您可以添加 for loop 随着heredoc。 我正在使用我们在第一个示例中看到的相同文件创建片段。

  • 数组变量“server”保存服务器名称列表。
  • For 循环遍历数组变量。
  • 文件创建命令被传递给 SSH 命令,该命令将在每个服务器上迭代并创建文件。 确保你添加 -T ssh 命令的标志,这将禁用伪终端分配。
declare -a server=( host1 host2 host3 ) for host in ${server[@]} do   ssh -T [email protected]${host} << EOF   echo "Running at host - ${host}"   if [[ ! -f /home/ostechnix/test ]];then     touch /home/ostechnix/test     echo "File Created"   else     echo "File exists"   fi EOF done

结论

Heredoc 是一个在 Bash 脚本中需要理解和使用的重要概念。 当您编写大量脚本时,您将更多地了解heredoc 以及最佳使用它的方法。

如果您以前从未使用过heredoc,请启动终端并尝试文章中的所有代码片段以更好地理解。

相关阅读:

  • Bash 脚本——用例子解释变量
  • Bash 脚本——用例子解释函数
  • 用 Linux 中的示例解释 Bash Echo 命令
  • Bash 脚本——For 循环用例子解释
  • Bash 脚本——用例子解释 While 和 until 循环

BASHBash 重定向CLI命令行此处文档此处DocLinuxLinux 管理Linux 基础知识Linux 命令Linux howtoLinux tipsShellShell scripting