П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3408 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 5958 раз(а).

Учебник HTML.
Просмотров 3202 раз(а).

Руководство по PHP5.
Просмотров 5418 раз(а).

Хостинг через призму DNS.
Просмотров 4018 раз(а).

Подборка текстов стандартных документов.
Просмотров 55709 раз(а).

Учебник PHP - Самоучитель
Просмотров 2995 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 4569 раз(а).

Внешние атаки...
Просмотров 3732 раз(а).

Учебник PHP.
Просмотров 2767 раз(а).

SSI в примерах.
Просмотров 37384 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Руководство пользователя для GNU Awk

15. Библиотека функций awk

15.10 Обработка параметров командной строки

Большинство средств на совместимых с POSIX системах принимают из командной строки параметры или "переключатели", которые могут использоваться для изменения поведения соответствующих программ. awk есть пример такой программы. (см. раздел 14.1 [Параметры командной строки], стр. 161). Часто параметры имеют аргументы, т.е. данные, в которых нуждается программа для правильного выполнения требований параметров. Например, awk-параметр `-F' требует цепочку для употребления в качестве разделителя полей. Первое вхождение в командной строке или `--' или цепочки, не начинающейся с `-' , означает конец параметров.

Большинство систем Unix имеют функцию языка Cи с именем getopt для обработки аргументов командной строки. Программист выдает цепочку, описывающую однобуквенный параметр. Если параметр требует какой-нибудь аргумент, за ним следует двоеточие. getopt также передаются количество и значения аргументов командной строки и она вызывается в цикле. getopt обрабатывает аргументы командной строки для букв параметров. На каждом обороте цикла она возвращает один символ, представляющий следующую букву параметра, которую обнаружила, или `?', если обнаружила неправильный параметр. Когда она возвращает \Gamma 1, это значит, что в командной строке больше нет параметров.

При использовании getopt параметры, у которых нет аргументов, могут быть сгруппированы вместе. Для параметров, которые могут иметь аргументы, требуется присутствие аргументов. Аргументы могут непосредственно следовать за буквой параметра или могут быть отдельными аргументами командной строки.

Пусть некая гипотетическая программа использует три параметра командной
строки, `-a', `-b' и `-c', и `-b' требует один аргумент. Тогда правильными
будут все следующие способа запуска этой программы:
prog -a -b foo -c data1 data2 data3
prog -ac -bfoo -- data1 data2 data3
prog -acbfoo data1 data2 data3

Отметим, что когда аргумент сгруппирован со своим параметром, остальные аргументы командной строки рассматриваются как аргументы этого параметра. В предыдущем примере `-acbfoo' указывает, что приведены все параметры `-a', `-b', и `-c', и что `foo' есть аргумент параметра `-b'.

getopt

дает четыре внешних переменных, которые программист может использовать:

optind

Индекс в массиве значений аргументов argv, показывающий где найти первый, не являющийся параметром аргумент командной строки.

optarg

Строковое значение аргумента параметра.

opterr

Обычно getopt печатает сообщение об ошибке, когда находит неверный параметр. Присваивание нуля переменной opterr выключает это свойство. (Прикладная программа может захотеть напечатать свое собственное сообщение.)

optopt

Буква, представляющая параметр командной строки. Хотя это обычно не документировано, большинство версий обладают этой переменной.

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

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

... /* print our own message */ opterr = 0;

while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) -
switch (c) - case 'f': /* file */
... break; case 'F': /* field separator */
... break; case 'v': /* variable assignment */
... break; case 'W': /* extension */
... break; case '?': default:
usage(); break; "" "" ... ""

Попутно gawk фактически использует функцию GNU getopt.long для обработки обычных и длинных, в стиле GNU, параметров (см. раздел 14.1 [Параметры командной строки], стр. 161).

Абстракция, которую обеспечивает getopt, очень полезна, она также может очень помочь в awk-программах. Приведем awk-версию для getopt. Эта функция подчеркивает одну из главных слабостей awk--- трудность манипуляций с отдельными символами. Для получения отдельных символов необходимо повторять вызовы substr (см. раздел 12.3 [Встроенные функции для манипуляций с цепочками], стр. 137). Дискуссии об этом заняли довольно много времени.


# getopt --- представляет в awk функцию getopt(3) из библиотеки Си
# # arnold@gnu.org # Public domain # # Initial version: March, 1991
# Revised: May, 1993
# External variables:
# Optind -- индекс в ARGV для первого аргумента не параметра
# Optarg -- цепочка значения аргумента текущего параметра
# Opterr -- если не ноль, то печатать нашу собственную диагностику
# Optopt -- текущая буква параметра
# Возвращает # -1 в конце параметров # ? для неопознанных параметров
# !c? символ, представляющий текущий параметр
# Private Data # .opti индекс в много флажковых параметрах, например, в  -abc

Функция начинается с документации: кто написал код, когда он пересматривался, затем идет список используемых глобальных переменных, какие значения выдаются и что они означают, и все глобальные переменные, которые являются "private" для этой библиотечной функции. Такая документация важна для любой программы и особенно для библиотечных функций.

function getopt(argc, argv, options, optl, thisopt, i) -
optl = length(options) if (optl == 0) # при отсутствии параметров
return -1
if (argv[Optind] == "--") - # все проделано

Optind++ .opti = 0 return -1 "" else
if (argv[Optind] !~ /^-[^: "t"n"f"r"v"b]/) -
.opti = 0 return -1 ""

Функция сначала проверяет, что она действительно вызвана с цепочкой параметров (аргумент options). Если options имеет длину 0, getopt сразу же возвращает \Gamma 1.

Идет проверка на конец options. Цепочка `--' означает конец параметров в командной строке, так же как любой аргумент командной строки, не начинающийся с `-'. Optind используется для продвижения по массиву аргументов командной строки; он сохраняет свое значение во всех обращениях к getopt, поскольку является глобальной переменной.

Используемое регулярное выражение /^-[^: "t"n"f"r"v"b]/ , по-видимому, несколько избыточно; оно ищет `-', за которыми следует что-то, отличное от whitespace или двоеточия.

Если текущий аргумент командной строки не соответствует этому образцу, он не параметр и прекращает обработку параметров.

if (.opti == 0)
.opti = 2 thisopt = substr(argv[Optind], .opti, 1) Optopt = thisopt
i = index(options, thisopt) if (i == 0) -
if (Opterr)
printf("%c -- invalid option"n",
thisopt) ? "/dev/stderr" if (.opti ?= length(argv[Optind])) -
Optind++ .opti = 0 "" else
.opti++ return "?" ""

Переменная opti следит за позицией в текущем аргументе командной строки (argv[Optind]). В случае, когда несколько параметров собраны вместе с одним `-' (например, `-abx'), необходимо передать их пользователя по одному за раз. Если .opti равно нулю, оно получает значение два, индекс следующего символа в цепочке для просмотра (мы пропускаем `-', стоящий в позиции один). Переменная thisopt содержит символ, полученный из цепочки. Он сохраняется в Optopt для использования в главной программе.

Если thisopt отсутствует в цепочке параметров, то это ошибочный параметр. Если Opterr не ноль, getopt печатает сообщение об ошибке в стандартном выходе для сообщений об ошибках, подобно сообщениям в Си-версии getopt.

Поскольку параметр неверен, его необходимо пропустить и двигаться к следующему символу параметра. Если .opti больше или равна длине текущего аргумента командной строки, то необходимо перейти к следующему, и Optind увеличивается, а .opti сбрасывается в 0. В противном случае Optind остается без изменения, а увеличивается только .opti

В любом случае, когда параметр ошибочен, getopt возвращает `?'. Главная программа может исследовать Optopt, если хочет узнать, какой буквой оказался неверный параметр.

if (substr(options, i + 1, 1) == ":") -
# выдает аргумент параметра
if (length(substr(argv[Optind], .opti + 1)) ? 0)
Optarg = substr(argv[Optind], .opti + 1) else
Optarg = argv[++Optind] .opti = 0 "" else
Optarg = ""

Если параметр требует аргумент, за буквой параметра в цепочке параметров следует двоеточие. Если в текущем аргументе командой строки (argv[Optind]) остаются еще символы, то остаток цепочки присваивается переменной Optarg. В противном случае используется следующий аргумент командной строки (`-xFOO' или `-x FOO'). В любом случае .opti сбрасывается в 0, так как больше не остается символов для исследования в текущем аргументе командной строки.

if (.opti == 0 ---- .opti ?= length(argv[Optind])) -
Optind++ .opti = 0 "" else
.opti++ return thisopt ""

Наконец, если .opti или ноль или больше чем длина текущего аргумента командной строки, то это значит, что этот элемент в argv полностью исследован, поэтому Optind увеличивается для указания на следующий в argv. Если ни одно условие не имеет значения true, то продвигается только .opti, так что следующая буква-параметр может обрабатываться следующим вызовом getopt.

BEGIN -
Opterr = 1 # default is to diagnose Optind = 1 # skip ARGV[0]
# test program
if (.getopt.test) -
while ((.go.c = getopt(ARGC, ARGV, "ab:cd")) != -1)
printf("c = !%c?, optarg = !%s?"n",
.go.c, Optarg) printf("non-option arguments:"n")
for (; Optind ! ARGC; Optind++)
printf(""tARGV[%d] = !%s?"n",
Optind, ARGV[Optind]) "" ""

Правило BEGIN инициализирует единицей обе Opterr и Optind. Opterr устанавливается в единицу, поскольку по умолчанию поведение getopt есть печать диагностических сообщений при обнаружении неверных параметров. Optind устанавливается в единицу, поскольку нет причин смотреть на имя программы, которое находится в ARGV[0]. Остальная часть BEGIN есть просто тест программы.

Приведем два примера пропуска тестовых программ.

$ awk -f getopt.awk -v .getopt.test=1 -- -a -cbARG bax -x
a c = !a?, optarg = !? a c = !c?, optarg = !? a c = !b?, optarg = !ARG?
a non-option arguments: a ARGV[3] = !bax? a ARGV[4] = !-x?
$ awk -f getopt.awk -v .getopt.test=1 -- -a -x -- xyz abc
a c = !a?, optarg = !?
error x -- invalid option
a c = !??, optarg = !?
a non-option arguments:
a ARGV[4] = !xyz? a ARGV[5] = !abc?

Первое `--' заканчивает аргументы awk, так что это не попытка рассматривать `-a' и следующие как ее собственные параметры. Несколько примеров программ, представленных в Главе 16 [Практические awk-программы], стр. 205, используют getopt для обработки своих аргументов.

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru