我正在使用shdoc为我的 bash 函数生成 markdown 文件;但是,我还想将相关的 bash 函数主体以及该主体中的注释附加到由 生成的 markdown 文件中shdoc
。如何打印 bash 函数主体,同时还包括函数主体中的注释?
举一个简单的例子,假设我的所有 bash 文件都包含在一个名为的目录中src
,并且所有这些文件都以 结尾.sh
。文件中的以下函数src/foo.sh
# @description A function that does something
foo() {
# oh wow, a comment
echo "something cool"
}
现在,如果我想获取没有注释的函数主体,我可以轻松地做到这一点,declare -f
如下所示,在名为的文件中src/doc.sh
:
# assuming you are in the `src` dir and both .sh files are executable
. foo.sh
foo_doc=$(declare -f foo)
echo "$foo_doc"
但问题是foo_doc
只有函数体,因为echo "$foo_doc"
foo ()
{
echo "something cool"
}
并且没有任何注释。因此,如果我将此信息附加到由 生成的 markdown 中shdoc
,它就不是源代码的理想文档。
我认为一种方法是使用sed
来确定与感兴趣的函数相对应的行(我的 bash 函数由 和 “分隔” {
,}
但根据评论我理解还有其他方法可以声明有效的 bash 函数),然后我可以使用来仅获取这里sed
完成的那些行。
这有点像 hack,但你可以使用冒号注释:
解释:
:
在 bash 中是一个无操作命令。你可以向它传递任何你想要的参数,它会忽略它们。所以这个“注释”实际上在技术上是一个命令,它是函数体的一部分,不执行任何操作。不过你必须小心,如果你的注释包含特殊字符,你必须用引号引起来。由于您可以访问包含函数定义的文件,因此您可以使用任何 POSIX awk 执行此操作:
它不是 100% 健壮的,但如果它们看起来像您提供的示例(即以从
alphanumeric_name (
一行的开头开始并以}
或)
从一行的开头结束),并且您的脚本中没有任何其他代码也看起来像这样但不是函数定义,那么它可能对您的函数来说已经足够好了。如果愿意,可以在测试中添加更多关键字
$1 !~
,或者可以通过添加调用使其更加健壮declare -F
,然后仅当字符串与报告的实际函数定义匹配时才接受上述正则表达式匹配的明显函数定义declare -F
。例如:
并且如果您还想获得在每个函数之前立即结束的注释:
请注意,这将仅打印您的文件中定义的以及在您的环境中可用的函数,这与第一个脚本不同,第一个脚本将打印您的文件中的所有函数。