Getopts 組込みコマンドはコマンドライン引数のオプションを解析します。
getopts オプションリスト 変数名 [引数…]
Getopts コマンドは、オペランドで与えられたコマンドライン引数に含まれている一文字のオプションを解析します。Getopts コマンドを一回呼び出すたびにオプションが一つ解析され、そのオプションを表す一文字が変数名で指定した変数に代入されます。
解析の対象となるオプションの種類もオペランドで指定します。オプションリストには受け付けるオプションの文字を並べて指定します。文字の後にコロン (:
) を付けるとそのオプションは引数をとるものとみなします。例えば、-a
, -b
, -c
の三種類のオプションを受け付け、さらにこれらのうち -b
が引数をとる場合、オプションリストには ab:c
を指定します。
引数をとるオプションを解析したとき、その引数の値が OPTARG
変数に代入されます。
オプションリストで与えられていないオプションに出くわしたときまたは引数をとるオプションに引数が与えられていないときの動作は、オプションリストの最初の文字がコロン (:
) であるかどうかで決まります。
OPTARG
変数に代入され、変数名で指定した変数には ?
(オプションリストで与えられていないオプションに出くわしたとき) または :
(引数をとるオプションに引数が与えられていないとき) が代入されます。
OPTARG
変数は削除され、変数名で指定した変数には ?
が代入されます。またこのとき標準エラーにエラーメッセージが出力されますが、それでも getopts コマンドの終了ステータスは 0 になります。
Getopts コマンドは、実行するたびに一つずつオプションを解析します。全てのオプションを解析するには、毎回同じ引数で getopts コマンドを繰り返し実行する必要があります。シェルは、オプションをどこまで解析したかを覚えておくために、OPTIND
変数を用います。全てのオプションを解析し終わるまでにこの変数を変更してはいけません。全てのオプションを解析し終わると、OPTIND
変数には引数 (または位置パラメータ) の中で最初のオペランドに当たるもののインデックスが代入されます (オペランドがない場合は引数または位置パラメータの個数 + 1 になります)。
異なる引数を解析させたい場合は、getopts コマンドに新しい引数を与える前に OPTIND
変数に 1
を代入してください。
なし
引数の中にオプションが見つかった場合は、(それがオプションリストに含まれているかどうかにかかわらず) 終了ステータスは 0 です。全てのオプションを解析し終わった時は、終了ステータスは非 0 です。
aopt=false bopt= copt=false
while getopt ab:c opt
do
case $opt in
a) aopt=true ;;
b) bopt=$OPTARG ;;
c) copt=true ;;
\?) return 2 ;;
esac
done
if $aopt; then echo Option -a specified; fi
if [ -n "$bopt" ]; then echo Option -b $bopt specified; fi
if $copt; then echo Option -c specified; fi
shift $((OPTIND - 1))
echo Operands are: $*
Getopts コマンドが解析するコマンドライン引数では、オプションは全てオペランドより前に指定してある必要があります。最初にオペランドが現れた時点で、getopts コマンドは解析を終了します。
Getopts コマンドは準特殊組込みコマンドです。
POSIX は、OPTIND
変数に 1
以外の値を代入した場合の動作を規定していません。