2012-04-07 5 views
4
私はこのように私のプログラムを呼び出す必要があり

は:へ:GetoptのシフトOPTARG

./program hello -r foo bar 

私はARGV [1]のうち、ハロー取るが、私は値バーに問題が生じています、また、私は「R」を変更する必要があります何か?

while((c = getopt(argc, argv, "r:")) != -1){ 
    switch(i){ 
    ... 
    case 'r': 
    var_foo = optarg; 
    //shell like argument shift here? 
    var_bar = optarg; 
    break; 
...} 

私はargvの通過でこれを行うことができます知っているが、bashの同様のgetopt同様の方法でそれを行う方法はありますか?

ありがとうございました。

+0

おそらく 'argv [optind ++]'のようなものでしょうか? –

答えて

7

barは、getoptの目のオプション引数ではありません。むしろ、GNU getoptは、処理の最後にargv[3]が "hello"、argv[4]が "bar"であるように、位置引数をに並べ替えます。基本的に、あなたはgetopting完了したら、あなたはまだ位置引数[optind, argc)プロセスにあります

int main(int argc, char * argv[]) 
{ 
    { 
     int c; 
     while ((c = getopt(argc, argv, ...)) != -1) { /* ... */ } 
    } 

    for (int i = optind; i != argc; ++i) 
    { 
     // have positional argument argv[i] 
    } 
} 
3

POSIXLY_CORRECTが環境に設定されているかどうか、それはあなたがGNU getopt()を使用したりしていないかどうかに依存し、あなたがしている場合。

古典的に(非GNU getopt()を意味する)、すべてのオプション引数は、オプションではない(ファイル名)引数の前に指定する必要があります。つまり、オプションのない引数が4つあることを意味します。

GNU getopt()があり、POSIXLY_CORRECTが設定されていない場合は、コマンドラインの任意の場所でオプション引数を処理します。その場合、引数値がfoo-rとオプションのない引数が2つ(hellobar)の2つのオプションがあります。

-rを認識するためにクラシックgetopt()を取得するには、まず(非オプション)引数を必要とする必要があるだろうとだけにして、全くgetopt()を呼び出す:

int main(int argc, char **argv) 
{ 
    char *cmd = argv[1]; 
    int opt; 

    argv[1] = argv[0]; 
    argv++; 
    argc--; 

    while ((opt = getopt(argv, argc, "r:")) != EOF) 
    { 
     switch (opt) 
     { 
     case 'r': 
      ...capture optarg... 
      break; 
     default: 
      ...report error.... 
      break; 
     } 
    } 

    for (int i = optind; i < argc; i++) 
     process_non_option_argument(cmd, argv[i]); 

    return(0); 
} 

GNU getoptを、非オプションを返すことができます。あなたがそれを可能にする場合は、引数を使用します。それ以外の引数は、常にオプションではない引数として扱われます。bar