名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 診断
getopts ユーティリティを使えば、引数リストからオプションやオプション引数を検索できます。
getopts は、呼び出されるたびに、name オペランドで指定されているシェル変数に次のオプションを入れ、シェル変数 OPTIND に処理すべき次の引数へのインデックスを入れます。シェルが呼び出されるたびに、OPTIND は 1 に初期設定されます。
オプション引数を必要とするオプションの場合、getopts はオプション引数をシェル変数 OPTARG に入れます。オプションがない場合または見つかったオプションにオプション引数がない場合、OPTARG は設定されません。
オプション文字の位置に、optstring オペランドに含まれていないオプション文字があると、name で指定されているシェル変数が疑問符 (?) 文字に設定されます。この場合、optstring の最初の文字がコロン (:) なら、シェル変数 OPTARG は見つかったオプション文字に設定されますが、標準エラー出力には何も出力されません。それ以外の場合、シェル変数 OPTARG は設定されず、標準エラー出力には診断メッセージが出力されます。この状況は、呼び出しアプリケーションに引数を渡す方法においてエラーがあったと判断され、getopts 処理のエラーとはなりません。
オプション引数がない場合は、以下のように処理されます。
optstring の最初の文字がコロン (:) なら、name で指定されているシェル変数はコロン文字に設定され、シェル変数 OPTARG は見つかったオプション文字に設定されます。
それ以外の場合、name で指定されているシェル変数は疑問符 (?) 文字に設定され、シェル変数 OPTARG は設定されず、標準エラー出力には診断メッセージが出力されます。この状況は、呼び出しアプリケーションに引数を渡す方法においてエラーがあったと判断され、getopts 処理のエラーとはなりません。この判断を示した診断メッセージが出力されますが、終了ステータスは 0 になります。
オプションの最後にくると、getopts はゼロより大きい戻り値で終了します。シェル変数 OPTIND は最初に現われた非オプション引数のインデックスに設定されます。このとき、最初に現われた - - 引数は、他の非オプション引数が先に現われない場合にオプションとしてみなされます。非オプション引数が 1 つもない場合は、$# + 1 に設定され、name 変数は疑問符 (?) 文字になります。オプションの最後を判断するのは、特殊オプション - - がある場合、- 以外で始まる引数が見つかった場合、またはエラーが発生した場合です。
シェル変数 OPTIND と OPTARG は getopts の呼び出し元のローカル変数であり、デフォルトではエクスポートされません。
name オペランドで指定されているシェル変数、OPTIND、および OPTARG は、現在のシェル実行環境に影響を及ぼします。
アプリケーションが OPTIND を 1 に設定すると、新しいパラメータセットが使用できるようになります。現在の位置パラメータまたは新しい arg 値です。すべての呼び出しで同じパラメータ (位置パラメータまたは arg オペランド) を使おうとしない場合、または OPTIND を1 以外の値に変更した場合、1 つのシェル実行環境で getopts を複数回呼び出すと、結果は保証されません。
getopts は、Bourne シェル組み込みコマンドの1 つであり、定位置パラメタの解析およびオプションの妥当性チェックに使用されます。sh(1) を参照してください。このコマンドは、コマンド構文標準規格 (intro(1) のルール 3 〜 10を参照) のうち、該当するルールすべてをサポートします。このコマンドは、getopt コマンドの代わりに使用してください。
optstring には、getopts を使用するコマンドが認識できるオプション文字を入れなければなりません。オプション文字の後にコロンが付いている場合は、そのオプションには 1 つまたは複数の引数があるとみなされます。オプションと引数の間は、空白によって区切られていなければなりません。
getopts は、呼び出されるたびに、次のオプションをシェル変数 name に入れ、処理すべき次の引数へのインデックスをシェル変数 OPTIND に入れます。シェルまたはシェル手続きが呼び出されるたびに、OPTIND の値は 1 に初期設定されます。
オプションにオプション引数が必要な場合、getopts はその引数をシェル変数 OPTARG に入れます。
不正なオプションが検出されると、? が name に入ります。
オプションの終わりが検出されると、getopts はゼロ以外の終了状態で終了します。特殊オプション - を使用して、オプションの終わりを表すことができます。
デフォルトでは、getopts は定位置パラメタを解析します。getopts コマンド行に追加の引数 (argument . . .) が指定されると、getopts は定位置パラメタの代わりにその引数を解析します。
/usr/lib/getoptcvt は、filename 内のシェルスクリプトを読み取り、getopts の代わりに getopt を使用できるようにそれを変換し、その結果を標準出力に出力します。
新しいコマンドはすべて、intro(1) で説明しているコマンド構文標準規格に従うようにするために、定位置パラメタの解析、およびオプションがそのコマンドの有効なオプションであるかどうかのチェックに、getopts または getopt を使用しなければなりません。
使用例
次に示すシェルプログラムの一部分では、オプション a または b、およびオプション引数の必要なオプション o を使用するコマンドについて、引数の使用例を示します。
while getopts abo: c do case $c in a | b) FLAG=$c;; o) OARG=$OPTARG;; ¥?) echo $USAGE exit 2;; esac done shift `expr $OPTIND - 1`
このコードは、次のコマンドすべてを同一内容として受け付けます。
cmd - a - b - o "xxx z yy" filename cmd - a - b - o "xxx z yy" -- filename cmd - ab - o xxx,z,yy filename cmd - ab - o "xxx z yy" filename cmd - o xxx,z,yy - b - a filename
getopts は、optstring に含まれていないオプション文字を検出すると、標準エラー出力にエラーメッセージを表示します。
現在の実装においては、次のようにコマンド構文標準規格 (intro(1) を参照) に従わない使用方法が認められていますが、このような使用方法は、将来、システムのリリースではサポートされないので、使用しないでください。前述の「使用例」と同様に、a および b がオプションであり、o はオプション引数を持つオプションとします。
次の例では、オプション引数を持つオプションは別のオプションと一緒にまとめることはできない、というルール 5 に違反しています。
example% cmd - aboxxx filename |
次の例では、オプション引数を持つオプションの後には、空白がなければならない、というルール 6 に違反しています。
example% cmd - ab oxxx filename |
シェル変数 OPTIND の値を変更したり、異なる引数の集まりを解析したりした場合の結果は不定です。
arg が正当なオプションを示しているかどうかをチェックします。arg を省略すると、定位置パラメタが使用されます。オプション引数は + または - で始まります。+ または - 以外の文字で始まっているオプション、また - 引数があると、オプションの終わりとみなされます。optstring には、getopts が認識する文字を記述します。文字の後に : が続く場合、そのオプションには引数があるとみなされます。オプションと引数とは空白文字で区切ることができます。
+ で始まる場合、getopts は + を起動するたびにname 内で見つかった次のオプション文字を設定します。次の arg のインデックスは OPTIND に格納されます。オプション引数がある場合は OPTARG に格納されます。
optstring 内で先頭に : がある場合は、getopts は無効なオプション文字を OPTARG に格納し、name を ? (未定義のオプションが指定された場合) または : (必要なオプション引数が省略されている場合) に設定します。getopts はエラーメッセージを表示します。オプションがなくなると、終了ステータスは 0 以外になります。
シェルの getopts 組み込みコマンドに関する詳細は、このマニュアルページ内で前述した Bourne シェル (sh) の説明を参照してください。
次のオペランドを使用できます。
getopts を呼び出すユーティリティによって識別されるオプション文字が入った文字列。文字の後ろにコロンが付いている場合、そのオプションには引数があることを意味します。引数は別個に指定する必要があります。アプリケーションは、オプション文字とそのオプション引数を別々に指定しなければなりませんが、そのように指定されているかどうかに関わらず、 getopts は、引数を取るオプションに続く文字をその引数と解釈します。オプション引数として NULL を渡すには getopts起動時に明示的に引数とする必要があります。getopt(3C) を参照してください。アプリケーションでは、疑問符とコロンをオプション文字としては使用できません。英数字以外のオプション文字を使用した場合の結果は保証できません。オプション引数とオプション文字とを別々に指定しないと、 OPTARG の値からオプション文字と - が取り除かれます。オプション文字がわからないとき、またはオプション引数がないとき、optstring の最初の文字によって、 getopts のふるまいが決まります。
getopts によって、見つかったオプション文字に設定されるシェル変数の名前。
デフォルトでは、getopts は、呼び出し側のシェルプロシージャに引き渡す位置パラメータの構文を解析します。arg s が指定されていれば、位置パラメータの代わりに解析されます。が指定されていれば、位置パラメータの代わりに解析されます。
getopts は現在のシェル実行環境に影響を及ぼすので、通常、シェルに組み込まれています。以下のように、サブシェルまたは別のユーティリティ実行環境から呼び出されると、getopts は呼び出し側の環境のシェル変数には影響しません。
(getopts abc value "$@") nohup getopts ... find . - exec getopts ... ¥;
なお、位置パラメータが変更されても、シェル関数は呼び出し側シェルと OPTIND を共有します。引数の構文を解析するために getopts を使用したい関数は、処理の最初で OPTIND の値を保存し、戻る前に復元するのが一般的です。ただし、呼び出し側シェル用に関数が OPTIND を変更する場合もあります。
aflag= bflag= while getopts ab: name do case $name in a) aflag=1;; b) bflag=1 bval="$OPTARG";; ?) printf "Usage: %s: [-a] [-b value] args¥n" $0 exit 2;; esac done if [ ! -z "$aflag" ]; then printf "Option -a specified¥n" fi if [ ! -z "$bflag" ]; then printf 'Option -b "%s" specified¥n' "$bval" fi shift $(($OPTIND - 1)) printf "Remaining arguments are: %s¥n" "$*"
getopts の実行に影響を与える環境変数 LC_CTYPE、LC_MESSAGES、NLSPATH についての詳細は、environ(5) を参照してください。
この変数は、次に処理する引数へのインデックスとして getopts が使用します。
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWcsu |
intro(1), getopt(1), getoptcvt(1), ksh(1), sh(1), getopt(3C), attributes(5), environ(5)
名前 | 形式 | 機能説明 | オペランド | 使用法 | 使用例 | 環境 | 終了ステータス | 属性 | 関連項目 | 診断