getopt - получает опциоанальный параметр из argv
Функция getopt возвращает очередной флаг из массива argv, соответствующий какой-либо букве в цепочке optstring. Optstring это строка из вариантов опций; Если за флагом следует двоеточие, то предполагается, что опция имеет аргумент или группу аргументов, отделенных от флага пробелами или табуляциями.В переменную optarg помещается указатель на начало аргумента распознанной опции.
После каждого вызова функция getopt помещает во внешнюю переменную optind индекс того элемента массива argv, который должен обрабатываться следующим. Поскольку optind является внешним, оно, как правило, инициализированно в нуль автоматически до первого вызова getopt
Когда все параметры обработаны (т.е. до первого неопционального аргумента), getopt возвращает EOF. Для ограничения конца опций, может быть использована спецопция --. В этом случее возвращен будет EOF а -- будет пропущен.
Функция getopt выводит сообщения об ошибках на stderr и возвращает символы вопроса (?) когда сталкивается с символом невключенным в optstring.
Нижеприведенный фрагмент кода показывает каким образом можно обрабатывать аргументы комманды, которые могут содержать взаимоисключающие опции a и b, и опции f и o, которые требуют аргументов:
main(argc, argv)
int argc;
char **argv;
{
int c;
extern int optind;
extern char *optarg;
.
.
.
while ((c = getopt(argc, argv, "abf:o:")) != EOF)
switch (c) {
case `a':
if (bflg)
errflg++;
else
aflg++;
break;
case `b':
if (aflg)
errflg++;
else
bproc();
break;
case `f':
ifile = optarg;
break;
case `o':
ofile = optarg;
break;
case `?':
default:
errflg++;
break;
}
if (errflg) {
fprintf(stderr, "Usage: ...");
exit(2);
}
for (; optind < argc; optind++) {
.
.
.
}
.
.
.
}
Написано Henry Spencer, для страниц руководства Bell Labs. Модифицировано Keith Bostic для большей совместимости с System V версией.
Не обязательно чтобы '-' стоял отдельно. В этой версии это рассматривается как неопциональный аргумент, что не всегда правильно.
Аргументы опций могут начинаться с '-'; это уменьшает количество возможных ошибок.
Функция getopt довольно гибкая, но очевидно что многое она неумеет, например проверка взаимоисключающих аргументов, проверка типа аргументов и т.п.