есть ли альтернативный способ передать два аргумента в качестве одной строки при использовании getopt? Обычно я бы сделал следующее:
./command -o "key value" [command arguments]
Тогда мне пришлось бы разделить строку аргумента явно
while ((op = getopt(argc, argv, "o:")) != EOF) { switch (op) { case 'o': char* result = NULL; result = strtok_r(optarg," "); while(result) { /* DO STUFF */ result = strtok(NULL," "); } break; default: printUsage() break; }
Итак, мне интересно, можно ли сделать следующее:
./command -o key value [command arguments]
делая getopt рассматривать значение «как» как -о второй аргумент, а не аргумент команды.
Стандарт POSIX getopt()
не поддерживает несколько аргументов для одной буквы флага. Есть несколько вариантов, доступных вам.
Один из вариантов – указать имена в качестве аргументов для отдельных букв опций (или использовать один и тот же дважды):
./command -o key -v value ./command -o key -o value
Другой вариант – использовать стандарт POSIX getsubopt()
и нотацию командной строки, такую как:
./command -o key=value
Это хорошо работает для вашего показанного сценария, если набор ключей относительно невелик (не так хорошо, если они большие, но вы можете обойтись без getsubopt()
затем просто проанализировать optarg
для =
.
Другой вариант – написать синтаксический анализатор командной строки, который будет принимать несколько аргументов по мере необходимости. Я написал один, чтобы иметь возможность анализировать разнообразные и недисциплинированные аргументы в отношении программ, которые мы используем на работе, – и это не ужасно сложно (хотя и это было нелегко). Он должен обрабатывать значения параметров N (N> 1) после одного флага. Свяжитесь со мной (см. Мой профиль), если вы хотите посмотреть на источник. Есть некоторые сложные проблемы для решения, например, что произойдет, если вы ожидаете 3 имени после буквы опции, но один из первых трех аргументов начинается с тире -
или --
появляется. Я допускаю только фиксированное количество аргументов, а не число переменных, но это отчасти потому, что моим вариантам использования не нужно было покрывать переменное число (и это звучит не так, как если бы это было так).
Как getopt
знает, где заканчиваются ваши опции -o
, и где начинаются ваши command arguments
?
Один простой способ – использовать спецификаторы -o
:
$ cat tc #include #include int main(int argc, char **argv) { char op; while ((op = getopt(argc, argv, "o:")) != EOF) { switch (op) { case 'o': printf("Option: %s\n", optarg); break; default: break; } } } $ gcc tc $ ./a.out -o one -o two -o three Option: one Option: two Option: three