スクリプト自体からヘルプメッセージを抽出したいと思います。
#!/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
効果がある! 2つの区切り記号# -\+$
と2つの区切り記号を含む内容のみを印刷します。問題は、区切り文字を印刷したくないということです。
人間に優しい構文を備えたマニュアルページジェネレータに関する提案はありますか?
修正する:たぶん私の質問が正しく表現されていないかもしれません。で始まり、で終わる# -----
2行の間の内容を印刷したいと思います----
。
私はこの解決策を知っています:
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
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に実装されています。次のURLを確認してくださいhttp://tldp.org/LDP/abs/html/here-docs.htm私
以下を使用できます。
cat <<end-of-message
----------------------------
message lines...
----------------------------
end-of-message
引数が入力された場合、または-hオプションなどのもの、または引数がない場合にのみ印刷する条件をスクリプトの上部に追加できます。