ヒアドキュメントで十分かもしれませんが。
hoge.sh
#!/bin/bash
# Usage: hoge [options] [dir]
#
# Options:
# -a Are na option
# -o val Ore no option
#
# Arguments:
# dir Document Root
set -ue
function usage()
{
sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0"
exit 1
}
# Usage Da Yo!
usage
$ ./hoge.sh
Usage: hoge [options] [dir]
Options:
-a Are na option
-o val Ore no option
Arguments:
dir Document Root
sed のコマンドの部分を整形すると次のようになります。
hoge.sh
(snip)
sed -rn '
/^# Usage/,${
/^#/ ! q
s/^# ?//
p
}
' "$0"
(snip)
このコマンドは次のような意味です。
-
/^# Usage/
にマッチする行から最終行まで-
/^#/
にマッチしない行が来たら終了 -
/^# ?/
を 空文字 に置換 - 表示する
-
次のように t コマンドで条件分岐させてもできます。この方が正規表現のマッチングの回数が減るかも。
hoge.sh
#!/bin/bash
# Usage: hoge [options] [dir]
#
# Options:
# -a Are na option
# -o val Ore no option
#
# Arguments:
# dir Document Root
set -ue
function usage()
{
sed -rn '
/^# Usage/,${
s/^# ?//
t p
q
:p p
}
' "$0"
exit 1
}
# Usage Da Yo!
usage
このコマンドは次のような意味です。
-
/^# Usage/
にマッチする行から最終行まで-
/^# ?/
を 空文字 に置換 - 置換が成功したらラベル p にジャンプ
- 終了する
- ラベル p
- 表示する
-
追記 2015/02/14
Usage に自分自身の名前を自動的に入れる版。
#!/bin/bash
# Usage: $0 [options] [dir]
#
# Options:
# -a Are na option
# -o val Ore no option
#
# Arguments:
# dir Document Root
set -ue
function usage()
{
sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0" |
sed -r "s/\\\$0/$(basename "$0")/"
exit 1
}
# Usage Da Yo!
usage
もしくは。
#!/bin/bash
# Usage: $(basename "$0") [options] [dir]
#
# Options:
# -a Are na option
# -o val Ore no option
#
# Arguments:
# dir Document Root
set -ue
function usage()
{
msg=$(sed -rn '/^# Usage/,${/^#/!q;s/^# ?//;p}' "$0")
eval $'cat <<__END__\n'"$msg"$'\n__END__\n'
exit 1
}
# Usage Da Yo!
usage