从脚本本身提取帮助信息

从脚本本身提取帮助信息

我希望从脚本本身中提取我的帮助消息。

#!/bin/bash
#
# foo - do things
# Author: John Doe <jhon@doe>
# ----------------------------------------------
# SYNOPSIS
#   foo [OPTIONS] FILE
# 
# DESCRIPTION
#   At vero eos et accusamus et iusto odio
#   dignissimos ducimus qui blanditiis praesenti
#   voluptatum deleniti atque corrupti quos.
# ----------------------------------------------

sed -n '/# -\+$/,/# -\+$/ p' $0

有用!它仅打印两个分隔符之间的内容# -\+$(包括两个分隔符)。问题是我不想打印分隔符。

您对具有人类友好语法的手册页生成器有什么建议吗?

更新:也许我的问题表述得不好。我只想打印以 开头# -----和结尾的两行之间的内容----

我知道这个解决方案:

sed -n '/# -\+$/,/# -\+$/ p' $0 | head -n -1 | tail -n +2

但我想要一个干净而优雅的解决方案,看起来不那么老套。

答案1

请尝试这个:

#!/bin/bash
#
# foo - do things
# Author: John Doe <jhon@doe>
# ----------------------------------------------
# SYNOPSIS
#   foo [OPTIONS] FILE
# 
# DESCRIPTION
#   At vero eos et accusamus et iusto odio
#   dignissimos ducimus qui blanditiis praesenti
#   voluptatum deleniti atque corrupti quos.
# ----------------------------------------------


cat `which $0` | sed -n '0,/# -\+$/d;/# -\+$/,$d;p'

答案2

您还可以通过以下方式完成此操作awk

awk '/^# --/{ flag=!flag; next}; flag' file

假设您用来分隔所需文本的文本在开头和结尾处相同,即 ,# --则正常范围模式会失败,所以你需要使用一个标志。这下一个声明在打印范围之前强制 awk 移动到下一条记录。

答案3

你可以非常简单地做到这一点awk

awk -v RS='\n# -+' 'NR==2' $0

RS适当设置记录分隔符并NR==2打印第二条记录。

您可以使用 删除注释符号和多余空格gsub,例如:

awk -v RS='\n# -+' 'NR==2 { gsub("\n# ", "\n"); print }' $0

更新

为了避免第一行为空,添加\nRS,但现在第一行没有被 替换gsub,因此gensub被调用:

awk -v RS='\n# -+\n' 'NR==2 { print gensub("(^|\n)# ", "\\1", "g") }' $0

答案4

您需要的称为“此处文档”。幸运的是,它已经在 bash 中实现了。查看以下网址http://tldp.org/LDP/abs/html/here-docs.htm

您只需使用以下内容:

cat <<end-of-message
----------------------------
message lines...
----------------------------
end-of-message

您可以在脚本顶部添加一个条件,仅当输入参数或类似 -h 选项或不存在参数时才打印该条件。

相关内容