我希望从脚本本身中提取我的帮助消息。
#!/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
答案3
你可以非常简单地做到这一点awk
:
awk -v RS='\n# -+' 'NR==2' $0
RS
适当设置记录分隔符并NR==2
打印第二条记录。
您可以使用 删除注释符号和多余空格gsub
,例如:
awk -v RS='\n# -+' 'NR==2 { gsub("\n# ", "\n"); print }' $0
更新
为了避免第一行为空,添加\n
到RS
,但现在第一行没有被 替换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 选项或不存在参数时才打印该条件。