# Getopts 組込みコマンド

Getopts 組込みコマンドはコマンドライン引数のオプションを解析します。

## 構文

- `getopts オプションリスト 変数名 [引数…]`

## 説明

Getopts コマンドは、オペランドで与えられたコマンドライン引数に含まれている一文字のオプションを解析します。Getopts コマンドを一回呼び出すたびにオプションが一つ解析され、そのオプションを表す一文字が変数名で指定した変数に代入されます。

解析の対象となるオプションの種類もオペランドで指定します。オプションリストには受け付けるオプションの文字を並べて指定します。文字の後にコロン (`:`) を付けるとそのオプションは引数をとるものとみなします。例えば、`-a`, `-b`, `-c` の三種類のオプションを受け付け、さらにこれらのうち `-b` が引数をとる場合、オプションリストには `ab:c` を指定します。

引数をとるオプションを解析したとき、その引数の値が `OPTARG` 変数に代入されます。

オプションリストで与えられていないオプションに出くわしたときまたは引数をとるオプションに引数が与えられていないときの動作は、オプションリストの最初の文字がコロン (`:`) であるかどうかで決まります。

- オプションリストの最初の文字がコロンの場合、そのオプションの文字が `OPTARG` 変数に代入され、変数名で指定した変数には `?` (オプションリストで与えられていないオプションに出くわしたとき) または `:` (引数をとるオプションに引数が与えられていないとき) が代入されます。

- オプションリストの最初の文字がコロンでない場合、`OPTARG` 変数は削除され、変数名で指定した変数には `?` が代入されます。またこのとき標準エラーにエラーメッセージが出力されますが、それでも getopts コマンドの終了ステータスは 0 になります。

Getopts コマンドは、実行するたびに一つずつオプションを解析します。全てのオプションを解析するには、毎回同じ引数で getopts コマンドを繰り返し実行する必要があります。シェルは、オプションをどこまで解析したかを覚えておくために、`OPTIND` 変数を用います。全てのオプションを解析し終わるまでにこの変数を変更してはいけません。全てのオプションを解析し終わると、`OPTIND` 変数には引数 (または位置パラメータ) の中で最初のオペランドに当たるもののインデックスが代入されます (オペランドがない場合は引数または位置パラメータの個数 + 1 になります)。

異なる引数を解析させたい場合は、getopts コマンドに新しい引数を与える前に `OPTIND` 変数に `1` を代入してください。

## オペランド

オプションリスト

  解析の対象となるオプションの文字の羅列です。

変数名

  解析結果の値を代入する変数の名前です。

引数s

  解析するコマンドライン引数です。

  このオペランドを指定しない場合は、位置パラメータを解析します。

## 終了ステータス

引数の中にオプションが見つかった場合は、(それがオプションリストに含まれているかどうかにかかわらず) 終了ステータスは 0 です。全てのオプションを解析し終わった時は、終了ステータスは非 0 です。

## 使用例

    aopt=false bopt= copt=false
    while getopts ab:c opt
    do
      case $opt in
      a) aopt=true ;;
      b) bopt=$OPTARG ;;
      c) copt=true ;;
      \?) return 2 ;;
      esac
    done
    if $aopt;          then echo オプション -a が指定されました;       fi
    if [ -n "$bopt" ]; then echo オプション -b $bopt が指定されました; fi
    if $copt;          then echo オプション -c が指定されました;       fi
    shift $((OPTIND - 1))
    echo オペランドは $*

## 補足

Getopts コマンドが解析するコマンドライン引数では、オプションは全てオペランドより前に指定してある必要があります。最初にオペランドが現れた時点で、getopts コマンドは解析を終了します。

Getopts コマンドは準特殊組込みコマンドです。

POSIX は、`OPTIND` 変数に `1` 以外の値を代入した場合の動作を規定していません。