LoginSignup
111
101

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-03

なぜ

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

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

コード

これを .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 っぽい形式にしてある。 {} で囲まれている部分を埋めればそれっぽい体裁は整う筈。

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

111
101
4

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
111
101