2
1

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 1 year has passed since last update.

この記事誰得? 私しか得しないニッチな技術で記事投稿!

「--help」が使えるシェルスクリプトを作る方法

Last updated at Posted at 2023-03-31

はじめに

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」と出力されるようにする。

「-e」と「--echo」を設定する
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

試してみる。

「-e」もしくは「--echo」で「hello world」
$ ./test.sh -e
hello world

$ ./test.sh --echo
hello world

引数を作る

ただし、上記の設定のままだと、echo "$1"のように直接引数を渡すと、未割り当ての変数ですと言われる。

test.sh
echo "$1"
引数を渡したのに「未割り当て」と言われる
$ ./test.sh テスト
./test.sh: 行 25: $1: 未割り当ての変数です

これは「-オプション」に合致しない引数に対する処理が書かれていないため。
*) test="$1";;を追加することで、処理を正常に動作させることが出来るようになる。

test.sh
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構文を使うことで、好きなオプションをシェルスクリプトに設定できるようになりました。

また、このヘルプの書き方は、引数の扱いに関して注意してください。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?