英語版
このページの英語版を見る

std.getopt

コマンドラインオプションの処理
getoptモジュールは getopt関数を実装している。 関数を実装している。GNU拡張は ダッシュ("--")で始まる長いオプションの形でサポートされている。 ("--").コマンドラインオプションのバンドルもサポートされている。 コマンドラインオプションのバンドルもサポートされているが、デフォルトでは有効になっていない。 デフォルトでは有効になっていない。

クレジット このモジュールとそのドキュメントはPerlの Getopt::Longモジュールにインスパイアされている。の構文は Dの getoptの構文はPerlのそれよりも単純で、 getopt 、渡されたポインタの静的な型から期待されるパラメータの型を推測するからである。 の静的型から期待されるパラメータ型を推測するからである。

ソース std/getopt.d

class GetOptException: object.Exception;
以下のいずれかの条件でスローされる:
  • 認識できないコマンドライン引数が渡された。 std.getopt.config.passThrough が存在しなかった。
  • コマンド行オプションが見つからなかった。 std.getopt.config.required が存在した。
  • コールバック・オプションに値がない。
GetoptResult getopt(T...)(ref string[] args, T opts);
文字列配列からコマンドライン・オプションを解析して削除する。

シノプシス

import std.getopt;

string data = "file.dat";
int length = 24;
bool verbose;
enum Color { no, yes };
Color color;

void main(string[] args)
{
  auto helpInformation = getopt(
    args,
    "length",  &length,    // 数値
    "file",    &data,      // 文字列
    "verbose", &verbose,   // フラグ
    "color", "Information about this color", &color);    // 列挙型
  ...

  if (helpInformation.helpWanted)
  {
    defaultGetoptPrinter("Some information about the program.",
      helpInformation.options);
  }
}
この getopt"関数"はコマンドラインへの参照を第一引数に取る。 (への参照(main )と、文字列とポインタの組を無制限に指定できる 文字列とポインタのペアを無制限に受け取る。各文字列は オプションである。 バインド」ポインタ)が参照する値を「埋める」ためのオプションである。を呼び出す際のオプション文字列は getoptの呼び出しのオプション文字列は、ダッシュで始まってはならない。
すべての場合において、コマンドラインオプションは getoptから削除される。 args.から削除される。 に残される。 argsに残される。 に残される。オプションの影響を受けなかった値は触れない。 そのため、一般的なイディオムは、オプションをデフォルトに初期化してから をデフォルトに初期化してから getopt.もし コマンドライン引数がパラメーターを持つオプションとして認識され、かつ コマンドライン引数がパラメータ付きオプションとして認識され、パラメータが正しく解析できない場合(例えば、数値が期待されるが存在しない が存在しない場合など)、ConvException 例外がスローされる。 もし std.getopt.config.passThroughに渡されなかった場合 getopt に渡されず、認識できないコマンドライン引数が見つかった場合、または必須引数 引数がない場合、GetOptException がスローされる。
バインドされるポインタの型による、 getopt は以下の種類のオプションを認識する:
  1. ブール型オプション。唯一の引数は、オプションをtrue に設定する。 さらに、true またはfalse をオプション内で "=" 記号で区切って設定することもできる。 を"="記号で区切って設定することもできる:
      bool verbose = false, debugging = true;
      getopt(args, "verbose", &verbose, "debug", &debugging);
    
    verbosetrue に設定するには、以下のいずれかでプログラムを起動する。 --verbose または--verbose=true でプログラムを起動する。
    debuggingfalse に設定するには、次のようにプログラムを起動する。 --debugging=false.
  2. 数値型オプション。オプションが数値型にバインドされている場合、次のオプションとして数値が期待される。 オプションが数値型にバインドされている場合、数値は次のオプションとして期待される。 で区切られる:
      uint timeout;
      getopt(args, "timeout", &timeout);
    
    timeout5 に設定するには、以下のいずれかでプログラムを起動する。 --timeout=5 または--timeout 5 でプログラムを起動する。
  3. インクリメンタル・オプション。オプション名に "+"接尾辞が付き、数値型にバインドされている場合、オプショ ンの値は、そのオプションが設定された回数を追跡する。 オプション名が"+"接尾辞を持ち、数値型にバインドされている場合、オプショ ンの値は、オプションがコマンドラインに出現した回数を追跡する。 オプションの値は、そのオプションがコマンドラインに現れた回数を追跡する:
      uint paranoid;
      getopt(args, "paranoid+", &paranoid);
    
    プログラムを"--paranoid --paranoid"で起動すると、 paranoid 、3 に設定される。インクリメンタル・オプションは決してパラメーターを期待しないことに注意、 例えば、コマンドライン"--paranoid 42 --paranoid"では、"42"は42に設定されない。 paranoid は42に設定されない。代わりに、paranoid は2に設定され、「42」は通常のプログラム引数の一部とはみなされない。 は通常のプログラム引数の一部とはみなされない。
  4. 列挙型オプション。オプションが列挙型にバインドされている場合、次のオプションとして列挙型シンボルが期待される。 文字列としての列挙記号が次のオプションとして期待される。 で区切られる:
      enum Color { no, yes };
      Color color; // デフォルトはColor.noに初期化される
      getopt(args, "color", &color);
    
    colorColor.yes に設定するには、以下のいずれかでプログラムを起動する。 --color=yes または--color yes でプログラムを起動する。
  5. 文字列オプション。オプションが文字列にバインドされている場合、次のオプションとして文字列が期待される。 オプションが文字列にバインドされている場合、文字列は次のオプションとして期待される。 「で区切られる:
    string outputFile;
    getopt(args, "output", &outputFile);
    
    プログラムを"--output=myfile.txt"または"--output myfile.txt"で起動すると、 が"myfile.txt"に設定される。 を付けてプログラムを起動すると、outputFile が"myfile.txt"に設定される。スペースを含む文字列 空白を含む文字列を渡したい場合は、使用するシェルに適したクォートを使用する必要がある。 例えば、--output='my file.txt'である。
  6. 配列オプション。オプションが配列にバインドされている場合、毎回新しい要素が配列に追加される。 が配列に追加される:
    string[] outputFiles;
    getopt(args, "output", &outputFiles);
    
    output=myfile.txt--output=yourfile.txt "または"--output myfile.txt --output yourfile.txt"でプログラムを起動する。 "--output myfile.txt --output yourfile.txt"でプログラムを起動すると、outputFiles[ "myfile.txt", "yourfile.txt" ].
    あるいは arraySepを設定することもできる。 に設定することもできる。
    string[] outputFiles;
    arraySep = ",";  // デフォルトは""で、パラメータごとに1つの要素を意味する
    getopt(args, "output", &outputFiles);
    
    上記のコードでは、次のようにしてプログラムを呼び出すことができる。 "--output=myfile.txt,yourfile.txt"、または"--output myfile.txt,yourfile.txt"でプログラムを起動できる。
  7. ハッシュ・オプション。オプションが連想配列にバインドされている場合は、"name=value"という形式の文字列を指定する。 オプションが連想配列に束縛されている場合、"name=値"という形式の文字列が次のオプションとして期待される。 という形式の文字列が次のオプションとして期待される:
    double[string] tuningParms;
    getopt(args, "tune", &tuningParms);
    
    例えば"-tune=alpha=0.5 --tune beta=0.6"でプログラムを起動すると、次のように設定される。 tuningParms を [ "alpha" : 0.5, "beta" : 0.6 ] に設定する。
    別の方法として arraySepを要素の区切り文字として設定することもできる:
    double[string] tuningParms;
    arraySep = ",";  // デフォルトは""で、パラメータごとに1つの要素を意味する
    getopt(args, "tune", &tuningParms);
    
    上記のコードで、次のようにプログラムを起動することができる。 "-tune=α=0.5,β=0.6"、または"-tune α=0.5,β=0.6"でプログラムを起動できる。
    一般に、キーと値は解析可能な型であれば何でも構わない。
  8. コールバック・オプション。オプションは関数またはデリゲートにバインドすることができる。 void function() void function(string option) void function(string option, string value) デリゲートにバインドすることができる。 デリゲートに相当する。
    • コールバックが引数を取らない場合、オプションが表示されるたびにコールバックが呼び出される。 が呼び出される。
    • コールバックが1つの文字列引数を取る場合、オプション文字列 (先頭のダッシュ(es)は含まない)がコールバックに渡される。 その後 オプション文字列は処理されたとみなされ、オプション配列から削除される。 配列から削除される。
      void main(string[] args)
      {
        uint verbosityLevel = 1;
        void myHandler(string option)
        {
          if (option == "quiet")
          {
            verbosityLevel = 0;
          }
          else
          {
            assert(option == "verbose");
            verbosityLevel = 2;
          }
        }
        getopt(args, "verbose", &myHandler, "quiet", &myHandler);
      }
      
    • コールバックが2つの文字列引数を取る場合、オプション文字列は1つの引数を持つオプションとして扱われ、それに応じて解析される。 は1つの引数を持つオプションとして扱われ、それに応じてパースされる。その オプションとその値がコールバックに渡される。その後、コールバックに渡された コールバックに渡されたものは、処理されたとみなされ、リストから削除される。 リストから削除される。
      int main(string[] args)
      {
        uint verbosityLevel = 1;
        bool handlerFailed = false;
        void myHandler(string option, string value)
        {
          switch (value)
          {
            case "quiet": verbosityLevel = 0; break;
            case "verbose": verbosityLevel = 2; break;
            case "shouting": verbosityLevel = verbosityLevel.max; break;
            default :
              stderr.writeln("Unknown verbosity level ", value);
              handlerFailed = true;
              break;
          }
        }
        getopt(args, "verbosity", &myHandler);
        return handlerFailed ? 1 : 0;
      }
      

複数の名前を持つオプション オプションの同義語が望ましい場合もある、 「loquacious"、"--garrulous"は同じ効果を持つ。このような このような代替オプション名をオプション指定に含めることができる、 をセパレーターとして使う:

bool verbose;
getopt(args, "verbose|loquacious|garrulous", &verbose);

ケース デフォルトでは、オプションは大文字と小文字を区別しない。この動作を変更するには を渡すことで変更できる。 getoptcaseSensitive を渡すことで変更できる:

bool foo, bar;
getopt(args,
    std.getopt.config.caseSensitive,
    "foo", &foo,
    "bar", &bar);
上の例では、"-foo"と"-bar"は認識されるが、"--Foo"、"--Bar"、 「は拒否される。 ディレクティブは getoptが終了するまで有効である。 の終わりまで、あるいは逆指令caseInsensitive が現れるまで有効である:
bool foo, bar;
getopt(args,
    std.getopt.config.caseSensitive,
    "foo", &foo,
    std.getopt.config.caseInsensitive,
    "bar", &bar);
オプション"--Foo"はstd.getopt.config.caseSensitive 、拒否されるが、"--Bar"、"--bAr"などは拒否されない。 std.getopt.config.caseInsensitive などは拒否される。 bar "オプションが解析される前に、 ディレクティブが感度をオフにしたからである。

短いオプションと長いオプション 伝統的に、プログラムはダッシュ1つで始まる1文字のオプションを受け入れてきた。 ダッシュ1つだけ(例:-t )。 getoptこのようなパラメータ をシームレスに使用できる。ダブル・ダッシュ(例:--t )と併用すると、1文字オプションは複数文字オプションと同じ動作をする。 は複数文字オプションと同じ動作をする。また をダッシュ1個と一緒に使うと、1文字のオプションを受け付ける。

timeout5 に設定するには、以下のいずれかを使用する:--timeout=5, --timeout 5 --t=5 --t 5 -t5 -t 5 のいずれかを使用する。のような形式は受け付けられない。 -timeout=5 などは受け付けられない。
ショートオプションの詳細については、次のセクションも参照のこと。

バンドル つまり、"-abc"は"-abc"と同じである。 "-a -b -c".デフォルトでは、このオプションはオフになっている。オンにするには にすることができる。 std.getopt.config.bundlingディレクティブでオンにできる:

bool foo, bar;
getopt(args,
    std.getopt.config.bundling,
    "foo|f", &foo,
    "bar|b", &bar);
一部のパラメーターに対してのみバンドル機能を有効にしたい場合は、次のようにする、 バンドルは std.getopt.config.noBundling.

必須 オプションは必須とマークすることができる。そのオプションが 例外がスローされる。

bool foo, bar;
getopt(args,
    std.getopt.config.required,
    "foo|f", &foo,
    "bar|b", &bar);
に続くオプションのみである。 std.getopt.config.requiredが必要である。 が必要である。

認識できないオプションを渡す アプリケーションがどの引数に対しても独自の処理を行う必要がある場合 getoptを渡すことができる。 std.getopt.config.passThroughディレクティブを渡すことができる。 getopt:

bool foo, bar;
getopt(args,
    std.getopt.config.passThrough,
    "foo", &foo,
    "bar", &bar);
baz "のような認識できないオプションは argsが返された後 getoptを返す。

ヘルプ情報の生成 オプション文字列の後に別の文字列が続く場合、この文字列はこのオプションの説明となる。 になる。この getopt関数は、次の型の構造体を返す。 GetoptResult.この戻り値には、渡されたすべてのオプションに関する情報が含まれる。 と、これらのオプションに関する情報が要求されたかどうかを示すbool GetoptResult.helpWanted フラグが含まれる。 フラグが含まれる。この getopt関数は、オプションがコマンドラインに表示された場合、常にオプション --help|-h オプションを追加する。

オプションのターミネーター ダブルダッシュで終了する getoptを終了させる。これは プログラム・オプションと他のパラメータ(例えば、他のプログラムに渡すオプション)を分けるために使われる。 他のプログラムに渡すオプション)と区別するために使われる。上記の例を次のように実行する。"--foo -- --bar" はfooを解析するが、"--bar"は残す。 args.がない限り、ダブルダッシュ自体は引数配列から削除される。 が引数配列から削除される。 std.getopt.config.keepEndOfOptions ディレクティブが与えられない限り、ダブルダッシュそのものは引数の配列から取り除かれる。

Examples:
auto args = ["prog", "--foo", "-b"];

bool foo;
bool bar;
auto rslt = getopt(args, "foo|f", "Some information about foo.", &foo, "bar|b",
    "Some help message about bar.", &bar);

if (rslt.helpWanted)
{
    defaultGetoptPrinter("Some information about the program.",
        rslt.options);
}
enum config: int;
getopt の設定オプション .
オプション文字列とバインドされたポインタの間を除けば、どの位置でもgetopt に渡すことができる。 文字列とそのバインドポインタの間を除いて、どの位置でも渡すことができる。
caseSensitive
大文字小文字を区別する
caseInsensitive
大文字小文字を区別しない(デフォルト)
bundling
バンドリングをオンにする
noBundling
バンドルオフにする(デフォルト)
passThrough
認識できない引数を通過させる
noPassThrough
認識できない引数をエラーとして通知する(デフォルト)
stopOnFirstNonOption
オプションに見えない最初の引数で停止する
keepEndOfOptions
引数からendOfOptionsセパレータを消さない
required
次のオプションを必須オプションにする
struct GetoptResult;
getopt 関数の結果。
helpWanted オプションパーサーに または オプションが渡された場合、このフラグが設定される。--help -h
bool helpWanted;
ヘルプが要求されたかどうかを示すフラグ
Option[] options;
すべての可能なオプション
struct Option;
オプションに関する情報。
string optShort;
このオプションの短いシンボル
string optLong;
このオプションの長いシンボル
string help;
このオプションの説明
bool required;
オプションが必須の場合、それを渡さないとエラーになる
dchar optionChar;
オプション文字(デフォルトは「-」)。
デフォルトは'-'だが、getopt を呼び出す前に代入することもできる。
string endOfOptions;
すべてのオプションの終わりを示す文字列(デフォルトは「--」)。
デフォルトは「--」だが、getopt を呼び出す前に割り当てることができる。に空の文字列を代入する。 に空の文字列を割り当てる。 endOfOptionsに空文字列を代入すると、事実上無効になる。
dchar assignChar;
パラメータを持つオプションで使われる代入文字(デフォルトは「=」)。
デフォルトは'='だが、getopt を呼び出す前に代入することもできる。
string arraySep;
""に設定すると、配列や連想配列のレシーバーへのパラメータは、個々の引数として扱われる。 は個々の引数として扱われる。つまり、オプションスイッチが現れるごとに、1つの引数のみが追加または挿入される。 オプションスイッチの出現ごとに、1つの引数のみが追加または挿入される。もし arraySepに設定されている場合は に設定されている場合、 各パラメータはまずセパレータで分割され、その個々の部分が同じオプションの引数として扱われる。 は同じオプションの引数として扱われる。
デフォルトは""だが、getopt を呼び出す前に代入することもできる。
@safe void defaultGetoptPrinter(string text, Option[] opt);
この"関数"は、渡されたOptionsとテキストを、stdout に整列して表示する。
渡されたテキストが最初に表示され、改行が続く。 そして、すべてのオプションのショートバージョンとロングバージョンが表示される。短いバージョンと長いバージョン は、渡されたOption の中で最も長いオプションに揃えられる。オプション が必須である場合、"Required:"がオプションの長いバージョンの後に表示される。 Option.ヘルプメッセージがある場合は、それが次に表示される。書式は次のとおりである。 このコードで説明する:
foreach (it; opt)
{
    writefln("%*s %*s%s%s", lengthOfLongestShortOption, it.optShort,
        lengthOfLongestLongOption, it.optLong,
        it.required ? " Required: " : " ", it.help);
}
Parameters:
string text ヘルプ出力の最初に表示するテキスト。
Option[] opt getopt パラメータから抽出されたOption
void defaultGetoptFormatter(Output)(Output output, string text, Option[] opt, string style = "%*s %*s%*s%s\n");
この関数は、渡されたテキストとOption を出力範囲に書き込む。 に書き込む。 defaultGetoptPrinterのドキュメントに記述されている方法で出力範囲に書き込む。
Parameters:
Output output ヘルプ情報を書き込むための出力範囲。
string text ヘルプ出力の最初に表示するテキスト。
Option[] opt getopt パラメータから抽出したOption を指定する。
string style 各ヘルプ出力の表示方法。Option.