22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-11

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

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
22
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?