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

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

Жанры

Основы программирования в 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
в качестве значения второго дополнительного параметра.

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

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Лекарь Империи 2

Карелин Сергей Витальевич
2. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 2

Я еще граф. Книга #8

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Я еще граф. Книга #8

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

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

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

Идеальный мир для Лекаря 27

Сапфир Олег
27. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 27

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

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

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

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Законы Рода. Том 2

Андрей Мельник
2. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 2

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI