はじめに
Linuxを使っていると、ちょっと作業をシェルスクリプトで自動化したくなることがあると思います。
そんな時に、他のUNIXコマンド同様、--help
や-h
で使い方が表示できるようになると便利。
下のテンプレートをシェルスクリプトの先頭に貼り付ければ、$ ./foo.sh --help
で使い方がターミナルに出力されます。
テンプレート
function usage() {
cat <<EOF
使い方: コマンド [<オプション>...]
-----コマンドの説明部分--------
オプション:
-h|--help ヘルプを表示
EOF
}
while [ -n "${1:-}" ]; do
case "$1" in
-h|--help) usage; exit 0;;
-*) echo -e 'エラー: 無効なオプションです。「-h」を使用してください。'; exit 1;;
"") break;;
esac
shift
done
- EOFとは、"End of File"(ファイルの終わり)を表す用語であり、ファイルの終わりに達したことを示す特別なシグナル。
- ファイルを読み込む際には、EOFに達すると読み込みが停止し、処理が終了する。
-
cat << EOF
とすることでそれまでに読み込んだ文字列を全て表示する。
-
-n $1
とすることで、引数が空白でない限りcase
構文を実行するようになる。-
${1:-}
はデフォルトの指定であり、-
は空文字を意味する
-
以下は英語バージョン。
function usage() {
cat <<EOF
Usage: command [<options>...]
-----コマンドの説明部分--------
Options:
-h|--help show help
EOF
}
while [ -n "${1:-}" ]; do
case "$1" in
-h|--help) usage; exit 0;;
-*) echo -e 'error: Invalid option. Use "--help"'; exit 1;;
"") break;;
esac
shift
done
使ってみる
今、test.sh
というシェルスクリプトで上記のコードを記述しているとする。
$ ./test.sh --help
使い方: コマンド [<オプション>...]
-----コマンドの説明部分--------
オプション:
-h|--help ヘルプを表示
空白はbreak
で無視するようになっているので、オプションまで間隔を空けてもちゃんと実行される。
$ ./test.sh --help
使い方: コマンド [<オプション>...]
-----コマンドの説明部分--------
オプション:
-h|--help ヘルプを表示
-
を伴う引数は、設定しているもの以外はエラーが出る。
$ ./test.sh -x
エラー: 無効なオプションです。「-h」を使用してください。
新しいオプションを作る
-e
もしくは--echo
で「hello world」と出力されるようにする。
while [ -n "${1:-}" ]; do
case "$1" in
-h|--help) usage; exit 0;;
-e|--echo) echo "hello world"; exit 0;;
-*) echo -e 'エラー: 無効なオプションです。「-h」を使用してください。'; exit 1;;
"") break;;
esac
shift
done
試してみる。
$ ./test.sh -e
hello world
$ ./test.sh --echo
hello world
引数を作る
ただし、上記の設定のままだと、echo "$1"
のように直接引数を渡すと、未割り当ての変数です
と言われる。
echo "$1"
$ ./test.sh テスト
./test.sh: 行 25: $1: 未割り当ての変数です
これは「-オプション」に合致しない引数に対する処理が書かれていないため。
*) test="$1";;
を追加することで、処理を正常に動作させることが出来るようになる。
while [ -n "${1:-}" ]; do
case "$1" in
-h|--help) usage; exit 0;;
-e|--echo) echo "hello world"; exit 0;;
-*) echo -e 'エラー: 無効なオプションです。「-h」を使用してください。'; exit 1;;
"") break;;
*) test="$1";;
esac
shift
done
echo $test
$ ./test.sh テスト
テスト
まとめ
このように、Usage関数とwhile構文を使うことで、好きなオプションをシェルスクリプトに設定できるようになりました。
また、このヘルプの書き方は、引数の扱いに関して注意してください。