解析 BASH 脚本中的heredoc注释

ljs*_*dev 2 syntax bash coding-style

我有一组 Bash 脚本,希望能够解析它们以提取它们的定义。

如果我在脚本 (ab) 中使用此处文档作为注释块来形成我的描述,如下所示,这会带来任何好处吗:

#!/bin/bash

DESCRIPTION = <<EOD

This nifty script does x, y and sometimes z

EOD

# rest of script...
Run Code Online (Sandbox Code Playgroud)

超过:

#!/bin/bash

# Description
# ==========
#
# This nifty script does x, y and sometimes z 

# rest of script...
Run Code Online (Sandbox Code Playgroud)

即,有没有一种简单的方法可以让我从 Bash 脚本中提取变量,或者我需要编写一个脚本来解析文件,以获得从# Description下一个空行到格式正确的描述块?

更新

对此有很多很好的答案。我选择了最适合我的用例和偏好的一个,但所有这些都是 Bash 注释实现的很好的例子。

Jon*_*ler 5

提取信息的难度没有实际差异。这些注释具有不可执行的轻微好处,因此不创建变量会带来边际性能优势$DESCRIPTION,但您很难衡量它。

\n\n

当然,还有一个额外的问题,即这里文档显示的语法不是有效的 shell。您需要考虑以下方面:

\n\n
cat >/dev/null <<EOD\n...\nEOD\n
Run Code Online (Sandbox Code Playgroud)\n\n

$DESCRIPTION或者也许(但也许不是 \xe2\x80\x94 除非你想在脚本本身中使用):

\n\n
DESCRIPTION=$(cat <<EOD\n...\nEOD\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,也许更好的是:

\n\n
: DESCRIPTION = <<EOD\n...\nEOD\n
Run Code Online (Sandbox Code Playgroud)\n\n

冒号命令是一个无操作;它评估其论点并取得成功。与任何一个cat变体相比,我更喜欢这个。和参数是干扰词DESCRIPTION=您可以省略其中一个或两个,而不影响脚本。您可能也想考虑在第一个周围使用引号EOD

\n\n
: <<'EOD'\n...$(cat this is not executed)...\nEOD\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,该:命令和第一个cat替代方法不会初始化 shell 变量$DESCRIPTION。如果这很重要,那么您将不得不使用命令替换$(...)版本,并注意到有两行标记了作业的结束。

\n