Help us understand the problem. What is going on with this article?

シェルスクリプトでヘルプメッセージをコメントに書いて表示する

More than 5 years have passed since last update.

ヒアドキュメントで十分かもしれませんが。

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
ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away