= Getopts 組込みコマンド
:encoding: UTF-8
:lang: ja
//:title: Yash マニュアル - Getopts 組込みコマンド

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

[[syntax]]
== 構文

- +getopts {{オプションリスト}} {{変数名}} [{{引数}}...]+

[[description]]
== 説明

Getopts コマンドは、オペランドで与えられたコマンドライン引数に含まれている{zwsp}link:builtin.html#argsyntax[一文字のオプション]を解析します。Getopts コマンドを一回呼び出すたびにオプションが一つ解析され、そのオプションを表す一文字が{{変数名}}で指定した{zwsp}link:params.html#variables[変数]に代入されます。

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

引数をとるオプションを解析したとき、その引数の値が link:params.html#sv-optarg[+OPTARG+ 変数]に代入されます。

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

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

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

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

[[operands]]
== オペランド

{{オプションリスト}}::
解析の対象となるオプションの文字の羅列です。

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

{{引数}}s::
解析するコマンドライン引数です。
+
このオペランドを指定しない場合は、{zwsp}link:params.html#positional[位置パラメータ]を解析します。

[[exitstatus]]
== 終了ステータス

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

[[example]]
== 使用例

----
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 オペランドは $*
----

[[notes]]
== 補足

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

Getopts コマンドは{zwsp}link:builtin.html#types[必須組込みコマンド]です。

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

link:posix.html[POSIX 準拠モード]では、{{オプションリスト}}に含まれるオプションは英数字でなければなりません。

// vim: set filetype=asciidoc expandtab:
