名前
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) を使うことができる。
オプション
-
-a, --alternative
-
長いオプションを 1 個の `
-' で始めることができるようにする。
-
-h, --help
-
ちょっとした使用ガイドを表示し、正常終了する。それ以上は何も出力されない。
-
-l, --longoptions longopts
-
認識させる長い (複数文字の) オプションを指定する。 2 つ以上のオプション名をコンマで区切って一度に指定できる。このオプションは 2 回以上指定することができる。
longopts は交換可能である。
longopts で指定されている長いオプション名の後に、1 個のコロンを続けることができる。これは、そのオプションに引き数が必須であることを示す。また、長いオプション名の後に 2 個のコロンを続けることもできる。これは、そのオプションが引き数を取る場合もあることを示す。
-
-n, --name progname
-
エラーが報告された場合に
getopt(3) ルーチンが使うプログラム名。このオプションを指定しても、
getopt(1) のエラーは getopt から発生したものとして表示される点に注意すること。
-
-o, --options shortopts
-
認識させる短い (1 文字の) オプションを指定する。このオプションが指定されていない場合、
getopt の 1 個の `
-' で始まっていない最初のパラメータ (かつ、オプションの引き数でないもの) が短いオプションの文字列として使われる。
shortopts に指定されている短いオプション文字の後に、1 個のコロンを続けることができる。これは、そのオプションに引き数が必須であることを示す。また、長いオプション名の後に 2 個のコロンを続けることもできる。これは、そのオプションが引き数を取る場合もあることを示す。オプションの解析法と出力の生成法を変更するために、 shortopts の最初の文字を `
+' または `
-' にすることができる (詳細は
「スキャンモード」 セクションを参照すること)。
-
-q, --quiet
-
getopt(3) によるエラー表示をさせない。
-
-Q, --quiet-output
-
通常の出力を生成させない。
-q を指定しない限り、
getopt(3) によってエラーが表示される。
-
-s, --shell shell
-
指定したシェルのクォート方法に設定する。-s オプションが指定されていない場合、
BASH でのクォート方法が使われる。指定可能な引き数は、現在のところ `
sh', `
bash', `
csh', `
tcsh' である。
-
-u, --unquoted
-
出力をクォートしない。空白と (シェル依存の) 特殊文字は、(他の
getopt(1) の実装と同じように) このモードでは大混乱を引き起こす。
-
-T --test
-
getopt(1) が拡張バージョンか古いバージョンかをテストする。何も出力しないが、エラーステータスを 4 に設定する。他の
getopt(1) の実装の場合や、このバージョンで環境変数
GETOPT_COMPATIBLE が設定されている場合、 `
--' を返し、エラーステータスを 0 に設定する。
-
-V, --version
-
バージョン情報を出力し、正常終了する。それ以上は何も出力されない。
解析
このセクションでは
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 にインストールされている。
環境変数
-
POSIXLY_CORRECT
-
この環境変数は
getopt(3) ルーチンで調べられる。これが設定されている場合、パラメータがオプションまたはオプション引き数でないと分かった時点で解析は停止する。それ以降の全てのパラメータは、 `
-' で始まっているかどうかに関係なく、オプションではないパラメータとして解釈される。
-
GETOPT_COMPATIBLE
-
getopt に対して強制的に
「書式」 セクションの最初の呼び出し形式を使わせる。
バグ
getopt(3) は、引き数を取っても取らなくてもよい長いオプションを解析できる (ただし、短いオプションの場合は解析できない)。この
getopt(1) は、オプション引き数が指定されていない場合、それが存在しないものとして扱う。
短いオプション変数を全く使いたくない場合、書式は全く直感的でないものになる (明示的に空の文字列に設定する必要がある)。
著者
Frodo Looijaard <frodol@dds.nl>
関連項目
getopt(3),
bash(1),
tcsh(1).