Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

switch(opt) {

case 'i':

case 'l':

case 'r':

printf("option: %c\n", opt);

break;

case 'f':

printf("filename: %s\n", optarg);

break;

case ':':

printf("option needs a value\n");

break;

case '?':

printf("unknown option: %c\n", optopt);

break;

}

 }

 for (; optind < argc; optind++)

printf("argument: %s\n", argv[optind]);

 exit(0);

}

Теперь,

когда вы выполните программу, то увидите, что все аргументы командной строки обрабатываются автоматически:

$ ./argopt -i -lr 'hi there' -f fred.с -q

option: i

option: l

option: r

filename: fred.c

unknown option: q

argument: hi there

Как это работает

Программа многократно вызывает функцию

getopt
для обработки аргументов-опций до тех пор, пока не останется ни одного, в этот момент
getopt
вернет -1. Для каждой опции выбирается подходящее действие, включая обработку неизвестных опций и пропущенных значений. Если у вас другая версия
getopt
, то вы получите вывод, слегка отличающийся от показанного, — особенно сообщения об ошибках — но смысл будет понятен.

Когда все опции обработаны, программа просто выводит оставшиеся аргументы, как и раньше, но начиная с номера, хранящегося в переменной

optind
.

getopt_long

Многие приложения Linux принимают более информативные аргументы, чем использованные в предыдущем примере односимвольные опции. Библиотека С проекта GNU содержит версию функции

getopt
, названную
getopt_long
, которая принимает так называемые длинные аргументы, которые вводятся с помощью двойного дефиса.

Рассмотрим упражнение 4.3.

Упражнение 4.3. Функция
getopt_long

Примените функцию

getopt_long
для создания новой версии примера программы, которая может вызываться с использованием длинных эквивалентов опций, например, следующих:

$ ./longopt --initialize --list 'hi there' --file fred.c -q

option: i

option: l

filename: fred.c

./longopt: invalid option --q

unknown option: q

argument: hi there

На самом деле и новые длинные опции, и исходные односимвольные можно смешивать. Длинным опциям также можно давать сокращенные названия, но они

должны отличаться от односимвольных опций. Длинные опции с аргументом можно задавать как единый аргумент в виде --опция= значение,

как показано далее:

$ ./longopt --init -l --file=fred.с 'hi there'

option: i

option: l

filename: fred.с

argument: hi there

Далее приведена новая программа longopt.c, полученная из программы argopt.c с изменениями, обеспечивающими поддержку длинных опций, которые в тексте программы выделены цветом.

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#define _GNU_SOURCE

#include <getopt.h>

int main(int argc, char *argv[]) {

 int opt;

 struct option_longopts[] = {

{"initialize", 0. NULL, 'i'},

{"file" 1, NULL, 'f'},

{"list", 0, NULL, 'l'},

 {0, 0, 0, 0}};

 while ((opt = getopt_long(argc, argv, ":if:lr, longopts, NULL)) != -1) {

switch(opt) {

case 'i':

case 'l':

case 'r':

printf("option: %c\n", opt);

break;

case 'f':

printf("filename: %s\n", optarg);

break;

case ':':

printf("option needs a value\n");

break;

case '?':

printf("unknown option: %c\n", optopt);

break;

}

 }

 for (; optind < argc; optind++)

printf("argument: %s\n", argv[optind]);

 exit(0);

}

Как это работает

Функция

getopt_long
принимает два дополнительных параметра по сравнению с функцией
getopt
. Первый из них — массив структур, описывающий длинные опции и сообщающий функции
getopt_long
способ их обработки. Второй дополнительный параметр — адрес переменной, которая может использоваться как вариант
optind
, предназначенный для длинных опций; для каждой распознанной длинной опции ее номер в массиве длинных опций может быть записан в эту переменную. В данном примере вам не нужна эта информация, поэтому вы используете
NULL
в качестве значения второго дополнительного параметра.

Поделиться:
Популярные книги

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Господин из завтра. Тетралогия.

Махров Алексей
Фантастика:
альтернативная история
8.32
рейтинг книги
Господин из завтра. Тетралогия.

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Неудержимый. Книга XXVII

Боярский Андрей
27. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVII

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Чужак из ниоткуда 4

Евтушенко Алексей Анатольевич
4. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 4

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация