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

一瞬でシェルスクリプト作れるシェル関数作った

More than 3 years have passed since last update.

なぜ

シェルスクリプトを書く時のボイラープレートが面倒になった。

あとはヘルプやオプションの形式の統一のとれたスクリプトのテンプレートを用意しておくことでチーム内でのレビューや野良スクリプトの扱いが楽になる。

コード

これを .profileなり.bashrcなり.zshrcなりに貼っておく。zshでしか確認してないがPOSIX互換シェルならどれでも動く筈。

2017-06-13: オプションの処理を若干更新した

new-script() {
    cat <<'SHELLSCRIPT' > "$1"
#!/bin/sh
# templated by http://qiita.com/blackenedgold/items/c9e60e089974392878c8
usage() {
    cat <<HELP
NAME:
   $0 -- {one sentence description}

SYNOPSIS:
  $0 [-h|--help]
  $0 [--verbose]

DESCRIPTION:
   {description here}

  -h  --help      Print this help.
      --verbose   Enables verbose mode.

EXAMPLE:
  {examples if any}

HELP
}

main() {
    SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"

    while [ $# -gt 0 ]; do
        case "$1" in
            --help) usage; exit 0;;
            --verbose) set -x; shift;;
            --) shift; break;;
            -*)
                OPTIND=1
                while getopts h OPT "$1"; do
                    case "$OPT" in
                        h) usage; exit 0;;
                    esac
                done
                shift
                ;;
            *) break;;
        esac
    done

    # do something
}

main "$@"

SHELLSCRIPT
    chmod +x "$1"
}

使い方

$ new-script path/to/scriptname.sh

ディレクトリは事前に作っておく必要がある。

他のオプションやヘルプはない。これ以上複雑なことをするならファイルに切り出す必要がある(POSIX Shellだと関数ローカルな変数を作れないため)。
そうすると手軽さが失われるのでこのままにしてある。

中身

まあ、やっていることはテンプレートをファイルに書き出して実行権限付けているだけなので大したことはしてない。
吐き出されるファイルはこうなる。

#!/bin/sh
# templated by http://qiita.com/blackenedgold/items/c9e60e089974392878c8
usage() {
    cat <<HELP
NAME:
   $0 -- {one sentence description}

SYNOPSIS:
  $0 [-h|--help]
  $0 [--verbose]

DESCRIPTION:
   {description here}

  -h  --help      Print this help.
      --verbose   Enables verbose mode.

EXAMPLE:
  {examples if any}

HELP
}

main() {
    SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"

    while [ $# -gt 0 ]; do
        case "$1" in
            --help) usage; exit 0;;
            --verbose) set -x; shift;;
            --) shift; break;;
            -*)
                OPTIND=1
                while getopts h OPT "$1"; do
                    case "$OPT" in
                        h) usage; exit 0;;
                    esac
                done
                shift
                ;;
            *) break;;
        esac
    done

    # do something
}

main "$@"

ポイントはオプションをパースする時の必勝法を組み込んだ点とヘルプにもスクリプトのドキュメントにもなる usage 関数を組み込んだ点。

mainはただのディスパッチャで処理は別の関数に切り出すつもりで作ってある。

usageは man っぽい形式にしてある。 {} で囲まれている部分を埋めればそれっぽい体裁は整う筈。

綺麗なシェルスクリプトで満たされる世の中であれ

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした