文章目录
- Here Document语法
- Here Document 的基本语法
- 使用场景
- 关于定界符
- 定界符不是变量
- 定界符在 Here Document 中只是一个字符串,主要功能是标记输入文本的开始和结束,使用时应遵循最佳实践格式要求
- 例子和说明
- 如何使用定界符
- 定界符可重复使用,但不推荐重复使用
- 示例说明
- 最佳实践
Here Document语法
在 Bash 脚本中,bc <<EOF ... EOF
结构使用了一种叫做 “Here Document” 的语法。这是一种特殊的输入重定向方式,它允许您在脚本中直接内嵌一个多行的文本块,并将这个文本块作为输入传递给命令。在这种情况下,它被用来提供输入给 bc
,这是一种命令行计算器。
Here Document 的基本语法
Here Document 的语法如下:
command <<DELIMITER
text
more text
DELIMITER
command
是需要输入的命令。DELIMITER
是一个自定义的结束符,用来标记输入块的开始和结束。这个结束符可以是任意字符串,如EOF
、END
等,只要它在文本块中不会被误解为其他内容。text
和more text
是将会传递给command
的输入内容。
在使用 bc
的例子中:
#!/bin/bashbc -l <<EOF
# 这里可以放入要执行的 bc 命令
a = 5
b = 3
a + b
l(2)
EOF
这个脚本块向 bc
传递了几个计算指令。bc
将执行这些指令并返回结果。这种方法特别适合于需要传递复杂脚本或多行命令到 bc
时使用。
使用场景
Here Document 通常用于以下情况:
- 自动化脚本中需要交互式命令的情况。
- 提供配置文件或脚本给命令,尤其是在内容较长或较复杂时。
- 简化脚本书写,避免多次 echo 或复杂的输入重定向。
这种方法简化了对 bc
等接受标准输入的程序的命令输入,使脚本更易于阅读和维护。
关于定界符
定界符不是变量
在使用 Here Document (<<EOF ... EOF
) 的结构时,EOF
并不一定要是一个全新的或未使用过的变量名。实际上,EOF
在这里并不作为变量使用,而是作为定界符,它的主要目的是明确地标记输入文本的开始和结束。
然而,选择一个合适的定界符确实非常重要,以避免与脚本中的其他文本混淆。这里有几个关键点需要注意:
-
唯一性:定界符应该是独特的,以确保它不会意外地出现在预期的输入文本中。如果定界符在文本中出现,它会被解释为 Here Document 的结束,这可能会导致脚本执行不正确。
-
一致性:通常使用
EOF
作为定界符,但您可以使用任何其他独特且不太可能在文本中出现的字符串,比如END
,FINISH
,STOP
等。 -
不是变量:虽然在很多编程场景中,像
EOF
这样的词可能看起来像是变量或命令的一部分,但在 Here Document 的上下文中,它只是一个文本标记。
定界符在 Here Document 中只是一个字符串,主要功能是标记输入文本的开始和结束,使用时应遵循最佳实践格式要求
定界符在 Here Document 中只是一个字符串,它的主要功能是标记输入文本的开始和结束。使用 Here Document 时,定界符的选择有一些基本的格式要求和最佳实践:
-
唯一性:定界符应该是一个在所提供的文本内容中不会出现的唯一字符串。这是为了避免将部分文本内容错误地识别为定界符,导致输入提前结束。
-
简单性:通常建议使用简单明了的字符串作为定界符,如
EOF
(End of File 的缩写)是非常常见的选择。其他常用的字符串包括END
、FINISH
等。 -
无空格:定界符不应包含空格或特殊字符。它应该是一个单一的、连续的字符串,以避免解释上的错误。
-
大写:虽然不是必须的,但常见的约定是使用全大写字母来增加其在脚本中的可见性和区分度。
例子和说明
如何使用定界符
以下是一个使用 Here Document 的示例,演示了如何使用定界符:
#!/bin/bash# 使用 EOF 作为定界符
cat <<EOF
这是一些文本。
这里可以包括各种字符,除了定界符自身。
EOF# 使用自定义定界符
cat <<MY_END_MARKER
这里是更多的文本。
注意定界符 MY_END_MARKER 在文本中是唯一的。
MY_END_MARKER
在这些示例中:
EOF
和MY_END_MARKER
都被用作定界符,它们在各自的 Here Document 中唯一,因此不会与文本内容混淆。- 在这些例子中,文本块被直接传递给
cat
命令,它简单地输出这些文本到标准输出。
总之,选择合适的定界符是使用 Here Document 的关键部分,它确保了输入的正确传递和脚本的可读性。
定界符可重复使用,但不推荐重复使用
定界符可以在同一个脚本中重复使用,只要每次使用的上下文是清晰且独立的。在使用 Here Document 的多个实例中,您可以使用相同的定界符,比如 EOF
,因为每个 Here Document 的内容是从定界符开始到下一个相同定界符结束的文本块。
每个 Here Document 是独立处理的,因此在一个脚本中多次使用相同的定界符不会引起冲突或错误,只要确保每个 Here Document 的定界符匹配正确。
示例说明
以下是一个展示在同一个脚本中多次使用同一定界符的示例:
#!/bin/bash# 第一次使用 EOF 作为定界符
cat <<EOF
1.这是一些文本。这里可以包括各种字符,除了定界符自身。EOF# 第二次使用相同的定界符 EOF
cat <<EOF
2.这是另一些文本。这里可以包括各种字符,除了定界符自身。
EOF
在这个脚本中,EOF
被用作两个不同的 Here Document 的定界符。每个 cat
命令将从其对应的 <<EOF
开始,直到遇到下一个 EOF
为止。这两个 Here Document 是完全独立的,因此使用相同的定界符不会造成任何问题。
最佳实践
虽然技术上可以在同一个脚本或上下文中重复使用相同的定界符,但在复杂的脚本或在有多个 Here Document 的情况下,使用不同的定界符有助于增加代码的清晰度和可读性,尤其是当 Here Document 的内容较长或逻辑较复杂时。这样做可以帮助防止混淆和错误,特别是在维护或修改脚本时。