Скажите getopt, что это не сделано, вариант разбора - PullRequest
0 голосов
/ 30 сентября 2018

Я использую getopt для разбора опций.Одна из опций, которые я анализирую (-a), имеет обязательный аргумент.

Мой вызов getopt выглядит следующим образом:

while((c = getopt(argc, argv, "a:b")) != -1) {
    switch(c) {
    case 'a':
        foo = atoi(optarg);
        break;
        ...
    }
}

Вот моя проблема:

Предположим, кто-тоработает ./my-command -a100b.Я хочу, чтобы моя программа сообщила, что есть опция -a с аргументом 100 и a -b.Однако getopt анализирует это как параметр -a с аргументом 100b.

Как я могу сказать, что getopt не завершил синтаксический анализ -a100b?Я хочу сказать, чтобы getopt начал синтаксический анализ символа b, чтобы он распознал наличие опции -b.

1 Ответ

0 голосов
/ 30 сентября 2018

Предположим, кто-то запускает ./my-command -a100b.Я хочу, чтобы моя программа сообщила, что есть опция -a с аргументом 100 и a -b.Однако getopt анализирует это как параметр -a с аргументом 100b.

Да, это так.Вот как работает язык опций, анализируемый getopt().

Как я могу сказать getopt, что он не завершил синтаксический анализ -a100b?Я хочу сказать, чтобы getopt начал синтаксический анализ символа b, чтобы он распознал наличие опции -b.

Вы не можете.Ни POSIX-стандарт getopt(), ни какая-либо известная мне расширенная версия (например, GNU) не поддерживают такую ​​вещь.В частности, спецификация POSIX для getopt говорит, в частности,

Функция getopt() - это синтаксический анализатор командной строки, который должен следовать Синтаксическим указаниям утилит 3, 4, 5, 6, 7, 9 и 10 в Руководстве по синтаксису утилиты XBD.

Эти рекомендации касаются параметров командной строки и их форматирования.Наиболее важными для вашего вопроса являются:

Рекомендация 3: Каждое имя параметра должно быть одним буквенно-цифровым символом (классификацией символов alnum) из переносимого набора символов.[...]

Указание 4: Перед всеми параметрами должен стоять символ «-».

Указание 5: Один илидополнительные параметры без аргументов-параметров, за которыми следует не более одного параметра, который принимает аргумент-параметр, должны приниматься при группировании за одним разделителем '-'.

Рекомендация 6: Каждый параметр иoption-аргумент должен быть отдельным аргументом, за исключением того, что отмечено в Синтаксисе аргумента утилиты, пункт (2).

Обратите особое внимание на правило 5: когда вы группируете опции вместе, только последний может быть тем, который принимаетАргумент.Это позволяет интерпретировать хвост этой группы или следующий полный аргумент как аргумент, что вы и делаете getopt.

Конечно, если вы хотите, чтобы ваша программа принимала параметры, которые не соответствуютв соответствии с рекомендациями POSIX, вы можете сделать это, но вам, вероятно, потребуется выполнить собственный анализ параметров.Может быть, вы можете получить getopt, чтобы помочь, но вам нужно будет добавить нетривиальный пользовательский слой разбора сверху.Это может быть проще, просто свернуть свое с нуля.

...