5

次のようにプログラムを呼び出す必要があります。

./program hello -r foo bar

argv[1] から hello を取り出しましたが、値バーに問題があります。また、「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 を使用して実行する方法はありますか?

ありがとう。

4

2 に答える 2

8

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]
     }
}
于 2012-04-07T21:54:47.273 に答える
3

GNUgetopt()を使用しているかどうか、使用している場合POSIXLY_CORRECTは環境に が設定されているかどうかによって異なります。

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

GNUgetopt()があり、set がない場合POSIXLY_CORRECTは、コマンド ラインの任意の場所でオプション引数が処理されます。その場合、-r引数 value を持つ 1 つのオプションfooと、2 つの非オプション引数 (helloおよびbar) があります。

Classicgetopt()に を認識させる-rには、最初の (オプションではない) 引数を必要とし、その後で呼び出しを行う必要があります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);
}

GNUgetoptを有効にすると、GNU はオプション以外の引数を返すこともできます。それ以外の場合、bar引数は常に非オプション引数として扱われます。

于 2012-04-07T22:15:06.847 に答える