なぜ
シェルスクリプトを書く時のボイラープレートが面倒になった。
あとはヘルプやオプションの形式の統一のとれたスクリプトのテンプレートを用意しておくことでチーム内でのレビューや野良スクリプトの扱いが楽になる。
コード
これを .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
っぽい形式にしてある。 {}
で囲まれている部分を埋めればそれっぽい体裁は整う筈。
綺麗なシェルスクリプトで満たされる世の中であれ