getopt - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
名前
getopt - コマンドの引き数を解析する (拡張版)
書式
getopt
optstring parameters
getopt
[options] [
--
] optstring parameters
getopt
[options]
-o
|
--options
optstring [options] [
--
] parameters
説明
getopt
は、シェル手続きで簡単に解析できるように、
コマンドラインのオプションを分解
(
解析
)するために使われる。
また、正しいオプションであるかを調べるためにも使われる。
これを行うために
GNU
getopt
(3)
ルーチンが使われる。
getopt
を呼び出すときに使われたパラメータは、
2 つの部分に分けることができる:
getopt の解析動作を変更するオプション
(
「書式」
セクションの
options
と
-o|--options optstring
)と、解析されるパラメータ
(
「書式」
セクションの
parameters
)である。
第 2 部分は、
最初のオプションではないパラメータ
(オプション引き数ではないもの) の後か、
最初の
` -- '
の後から始まる。
第 1 部分に
`
-o
'
または
`
--options
'オプションが見つからない場合、
第 2 部分の最初のパラメータは
短い形式のオプション文字列として使われる。
環境変数
GETOPT_COMPATIBLE
が設定された場合、
または最初のパラメータがオプションでなかった場合
(`
-
'で始まっていない場合。
これは
「書式」
セクションの最初の形式である)、
getopt
は他のバージョンの
getopt
(1) と互換性のある出力を生成する。
この場合でも、パラメータの並べ替えを行い、オプション引き数を認識する
(詳細は
「互換性」
セクションを参照すること)。
伝統的な
getopt
(1) の実装では、引き数やオプションではないパラメータで
空白と他の (シェル特有の) 特殊文字を組み合わせて使うことができない。
この問題を解決するため、
この実装ではクォートした出力を生成する。
この出力は、シェル (通常は
eval
コマンドが使われる) によって再び解析されなければならない。
これにはクォートすべき文字列を保護するという効果があるが、
getopt
を他のバージョンとは互換性のない方法
(
「書式」
セクションの 2, 3 番目の形式) で呼び出さなければならない。
拡張版の
getopt
(1) がインストールされているかどうかを調べるには、特別なテストオプション
(
-T
)
を使うことができる。
オプション
長いオプションを 1 個の
`
-
'で始めることができるようにする。
ちょっとした使用ガイドを表示し、正常終了する。
それ以上は何も出力されない。
認識させる長い (複数文字の) オプションを指定する。
2 つ以上のオプション名をコンマで区切って一度に指定できる。
このオプションは 2 回以上指定することができる。
longopts
は交換可能である。
longopts
で指定されている長いオプション名の後に、1 個のコロンを続けることができる。
これは、そのオプションに引き数が必須であることを示す。
また、長いオプション名の後に 2 個のコロンを続けることもできる。
これは、そのオプションが引き数を取る場合もあることを示す。
エラーが報告された場合に
getopt
(3) ルーチンが使うプログラム名。
このオプションを指定しても、
getopt
(1) のエラーは getopt から発生したものとして表示される点に注意すること。
認識させる短い (1 文字の) オプションを指定する。
このオプションが指定されていない場合、
getopt
の 1 個の
`
-
'
で始まっていない最初のパラメータ (かつ、オプションの引き数でないもの) が
短いオプションの文字列として使われる。
shortopts
に指定されている短いオプション文字の後に、1 個のコロンを続けることができる。
これは、そのオプションに引き数が必須であることを示す。
また、長いオプション名の後に 2 個のコロンを続けることもできる。
これは、そのオプションが引き数を取る場合もあることを示す。
オプションの解析法と出力の生成法を変更するために、
shortopts の最初の文字を
`
+
'
または
`
-
'
にすることができる
(詳細は
「スキャンモード」
セクションを参照すること)。
getopt(3) によるエラー表示をさせない。
通常の出力を生成させない。
-q
を指定しない限り、
getopt
(3) によってエラーが表示される。
指定したシェルのクォート方法に設定する。
-s オプションが指定されていない場合、
BASH
でのクォート方法が使われる。
指定可能な引き数は、現在のところ
`
sh
',`
bash
',`
csh
',`
tcsh
'である。
出力をクォートしない。
空白と (シェル依存の) 特殊文字は、(他の
getopt
(1) の実装と同じように) このモードでは大混乱を引き起こす。
getopt
(1)
が拡張バージョンか古いバージョンかをテストする。
何も出力しないが、エラーステータスを 4 に設定する。
他の
getopt
(1) の実装の場合や、このバージョンで環境変数
GETOPT_COMPATIBLE
が設定されている場合、
`
--
'
を返し、エラーステータスを 0 に設定する。
バージョン情報を出力し、正常終了する。
それ以上は何も出力されない。
解析
このセクションでは
getopt
のパラメータの第 2 部分
(
「書式」
セクションの
parameters
)のフォーマットについて説明している。
次のセクション
(
出力
)
では生成される出力について説明している。
これらのパラメータは、一般に、シェル関数が呼ばれたときのパラメータである。
シェル関数が呼ばれたときの各パラメータが
getopt
のパラメータリストにある 1 つのパラメータに
厳密に対応している点に注意しなければならない
(
「例」
セクションを参照すること)。
全ての解析が GNU
getopt
(3)
ルーチンで行われる。
パラメータは左から右へ解析される。
各パラメータは、短いオプション・長いオプション・オプションへの引き数・
オプションではないパラメータに分類される。
簡単な短いオプションは、
`
-
'
の後に短いオプション文字が続くものである。
オプションが引き数を必須としている場合、
引き数はオプション文字の直後に書くことができる。
(コマンドライン上で空白で区切られた) 次のパラメータとして書くこともできる。
オプションが引き数を取ることも取らないこともできる場合、
引き数が存在するならば、オプション文字の直後に書かなければならない。
(最後のオプションを除く) 全てのオプションが
必須の引き数もオプションとしての引き数も必要としない限り、
1 個の
`
-
'の後に複数の短いオプションを指定することができる。
長いオプションは、通常
`
--
'
の後に長いオプション名が続く。
オプションが引き数を必須としている場合、
`
=
'で区切って長いオプション名の直後に書くことができる。
また、(コマンドライン上で空白で区切って) 次の引き数として書くこともできる。
オプションが引き数を取ることも取らないこともできる場合、
引き数が存在するならば、
`
=
'で区切って長いオプション名の直後に書かなければならない
(`
=
'をオプションの後に書いたにも関らず、その後に何も指定しなかった場合、
引き数が存在しないものとして解釈される。
これはちょっとしたバグである。
「バグ」
セクションを参照すること)。
長いオプションは、省略形が曖昧でない (他のオプションと区別がつく) 限り、
短く省略することができる。
`
-
'で始まらず、かつ前のオプションが必須としている引き数でもないパラメータは、
オプションではないパラメータである。
`
--
'
パラメータの後にあるパラメータは、
オプションではないパラメータとして解釈される。
環境変数
POSIXLY_CORRECT
が設定されている場合、
または短いオプション文字列が
`
+
'で始まっている場合、
最初のオプションではないパラメータが見つかった時点で、
残りの全てのパラメータはオプションではないパラメータとして解釈される。
出力
出力は前のセクションで説明した各要素に対して生成される。
出力は要素が入力で指定された順番で生成される。
ただし、オプションではないパラメータは例外である。
出力は
互換
(
クォートされない
)モードで生成することができる。
また、引き数とオプションではないパラメータに含まれる空白と他の特殊文字を
保護するモードで出力することもできる
(
「クォート」
セクションを参照すること)。
出力がシェルスクリプトで処理される場合、
その出力は別々の要素から構成されているようにみえる。
この要素は (大部分のシェル言語では shift コマンドを使って)
1 つ 1 つ処理できる。
この動作はクォートされないモードでは不完全である。
なぜなら、要素に空白や特殊文字があった場合、
要素が期待していない箇所で分割されてしまうからである。
必須とされる引き数が見つからない、またはオプションが認識されない、
といった原因でパラメータ解析に問題がある場合、
標準エラーにエラーが表示される。
このとき、不正な要素に対しては何も出力されず、
0 でないエラーステータスが返される。
短いオプションに対して、出力として 1 個の
`
-
'
とオプション文字が生成される。
オプションが引き数を取る場合、次のパラメータが引き数になる。
オプションが引き数を取っても取らなくてもよい場合に、
引き数が指定されていないと、
クォートモードでは次のパラメータが生成されるが空のパラメータになる。
この場合、クォートしない (互換) モードでは
2 番目のパラメータは生成されない。
他の多くの
getopt
(1)
の実装では、取っても取らなくてもよい引き数は
サポートされていない点に注意すること。
複数の短いオプションが 1 個の
`
-
'
の後に指定されている場合、
各オプションは区切られたパラメータとして出力に表示される。
長いオプションに対して、
`
--
'
と完全なオプション名が 1 つのパラメータとして生成される。
「入力でオプションが略書きされている。
または、オプションが 1 個の
`
-
'
を使って指定されている。」ということに関らず、この動作をする。
引き数は短いオプションとして扱われる。
通常、全てのオプションとその引き数が出力に生成されるまで、
オプションではないパラメータは出力されない。
そして、1 個のパラメータとして
`
--
'
が生成される。
その後にオプションではないパラメータは、
見つかった順番で別々のパラメータとして生成される。
短いオプション文字列の最初の文字が
`
-
'である場合にのみ、
オプションではないパラメータは入力で見つかった位置で出力される
(この動作は
「書式」
セクションの最初の形式が使われた場合にはサポートされない。
この場合、
`
-
'と
`
+
'が前に付く全てのパラメータが無視される)。
クォート
互換モードでは、引き数やオプションではないパラメータにある
空白や「特殊」文字は正しく扱われない。
この出力はシェルスクリプトに与えられるので、
スクリプトは、出力をどのようにして個々のパラメータに
分割すべきなのかを知らない。
この問題を回避するため、この実装ではクォート機能を提供する。
これは、各パラメータをクォートして出力を生成する、という手法を取る。
この出力がもう一度シェル (通常はシェルの
eval
コマンド) に与えられた場合、
出力は個々のパラメータに正しく分割される。
環境変数
GETOPT_COMPATIBLE
が設定された場合・
「書式」
セクションの最初の形式が使われた場合・
`
-u
'オプションが指定された場合、クォートは行われない。
クォートの規則はシェルごとに異なる。
使用しているシェルを選択するために
`
-s
'オプションを使うことができる。
以下のシェルで正しく機能する:
`
sh
',`
bash
',`
csh
'
,
`
tcsh
'.実際には、2 つの「方式」に分類される:
sh 式のクォート規則と csh 式のクォート規則である。
他のシェルスクリプト言語を使っている場合でも、
これらの方式のどちらかが使える可能性がある。
スキャンモード
特殊なスキャンモードであることを示すために、
短いオプションの最初の文字を
`
-
'または
`
+
'にすることができる。
「書式」
セクションの最初の呼び出し形式が使われた場合、これは無視される。
しかし、環境変数
POSIXLY_CORRECT
が指定されているかどうかは調べられる。
最初の文字が
`
+
'の場合、または環境変数
POSIXLY_CORRECT
が設定されている場合、オプションではない最初のパラメータ
(つまり、
`
-
'で始まっていないパラメータ) が
オプション引き数でないと分かった時点で解析はストップする。
それ以降の全てのパラメータは、オプションではないパラメータとして解釈される。
最初の文字が
`
-
'の場合、オプションではない引き数は見つかった箇所で出力される。
通常の操作では、
`
--
'
パラメータが生成された後で、最後にまとめて出力される。
この場合でも
`
--
'パラメータは生成されるが、
通常このモードでは最後のパラメータになる点に注意すること。
互換性
このバージョンの
getopt
(1) は、出来るだけ他のバージョンと互換性があるように書かれた。
通常は他のバージョンを修正することなく、
このバージョンに置き換えることができる。
更に、いくつかの利点がある。
getopt の最初のパラメータの最初の文字が
`
-
'でない場合、getopt は互換モードになる。
最初のパラメータは短いオプションの文字列として解釈され、
他の全ての引き数が解析される。
この場合でも、環境変数
POSIXLY_CORRECT
が設定されていない限り、パラメータの並べ替えを行う
(つまり、オプションではない全てのパラメータが最後に出力される)。
環境変数
GETOPT_COMPATIBLE
は
getopt
を強制的に互換モードにする。
この環境変数と
POSIXLY_CORRECT
の両方を設定すると、「難しい」プログラムのために 100% の互換性を提供する。
しかし、通常はどちらも設定する必要がない。
互換モードでは、短いオプション文字列の最初に付く
`
-
'と
`
+
'は無視される。
リターンコード
解析に成功した場合、 getopt はエラーコード 0 を返す。 getopt (3) がエラーを返した場合は 1 を返す。 パラメータが理解できなかった場合は 2 を返す。 メモリが足りない (out-of-memory) といった内部エラーの場合は 3 を返す。 -T オプションを付けて呼び出された場合は 4 を返す。
例
(ba)sh と (t)csh での使用例のスクリプトは、 getopt (1) ディストリビューションで提供されている。 これらはオプションとして /usr/local/lib/getopt または /usr/lib/getopt にインストールされている。
環境変数
この環境変数は
getopt
(3) ルーチンで調べられる。
これが設定されている場合、パラメータがオプションまたは
オプション引き数でないと分かった時点で解析は停止する。
それ以降の全てのパラメータは、
`
-
'で始まっているかどうかに関係なく、
オプションではないパラメータとして解釈される。
getopt
に対して強制的に
「書式」
セクションの最初の呼び出し形式を使わせる。
バグ
getopt
(3) は、引き数を取っても取らなくてもよい長いオプションを解析できる
(ただし、短いオプションの場合は解析できない)。
この
getopt
(1) は、オプション引き数が指定されていない場合、それが存在しないものとして扱う。
短いオプション変数を全く使いたくない場合、
書式は全く直感的でないものになる
(明示的に空の文字列に設定する必要がある)。
著者
Frodo Looijaard <frodol@dds.nl>