Linux программирование в примерах | страница 36



. Но это не подходит для кого-то еще, кто пытается прочесть код и не знает наизусть значений всех символов опций. Гораздо лучше использовать имена, передающие смысл опции, как >no_newline для опции >-n echo.

2.3.2. GNU >getopt() и порядок опций

Стандартная функция >getopt() прекращает поиск опций, как только встречает аргумент командной строки, который не начинается с GNU >getopt() отличается: она просматривает в поисках опций всю командную строку. По мере продвижения она переставляет элементы >argv, так что после ее завершения все опции оказываются переставленными в начало, и код, продолжающий разбирать аргументы с >argv[optind] до >argv[argc-1], работает правильно. Во всех случаях специальный аргумент '>--' завершает сканирование опций.

Вы можете изменить поведение по умолчанию, использовав в >optstring специальный первый символ следующим образом:

>optstring[0] == '+'

GNU >getopt() ведет себя, как стандартная >getopt(); она возвращает опции по мере их обнаружения, останавливаясь на первом аргументе, не являющемся опцией. Это работает также в том случае, если в окружении присутствует строка >POSIXLY_CORRECT.

>optstring[0] == '-'

GNU >getopt() возвращает каждый аргумент командной строки независимо от того, представляет он аргумент или нет. В этом случае для каждого такого аргумента функция возвращает целое 1, а указатель на соответствующую строку помещает в >optarg.

Как и для стандартной >getopt(), если первым символом >optstring является '>:', GNU >getopt() различает «неверную опцию» и «отсутствующий аргумент опции», возвращая соответственно '>?' или '>:'. Символ '>:' в >optstring может быть вторым символом, если первым символом является '>+' или '>-'.

Наконец, если за символом опции в >optstring следуют два двоеточия, эта опция может иметь необязательный аргумент. (Быстро повторите это три раза!) Такой аргумент считается присутствующим, если он находится в том же элементе >argv, что и сама опция, и отсутствующим в противном случае. В случае отсутствия аргумента GNU >getopt() возвращает символ опции, а в >optarg записывает NULL. Например, пусть имеем:

>while ((с = getopt(argc, argv, "ab::")) != -1)

>...

для >-bYANKEES, возвращаемое значение будет '>b', a >optarg указывает на «>YANKEES», тогда как для >-b или '>-b YANKEES' возвращаемое значение будет все то же '>b', но в >optarg будет помещен NULL. В последнем случае «>YANKEES» представляет отдельный аргумент командной строки.

2.3.3. Длинные опции

Функция >getopt_long()