Отправляет email-рассылки с помощью сервиса Sendsay

Программирование на shell и awk

  Все выпуски  

От слов к делу


Информационный Канал Subscribe.Ru


Выпуск #4

  «Почти всем сложным программам для работы требуется входные параметры (опции, аргументы — называйте как хотите), от значения которых строится последовательность работы алгоритма заложенного в программе или используются различные источники данных.» [1]
(орфография и пунктуация сохранена авторская)

Приветствую!
Сегодня мы наконец-то создадим свой первый сценарий. Он будет маленьким и полезным. Это на дессерт, а в качестве закуски рассмотрим один терминологический вопросик. Согласен, что это смахивает на занудство, но все равно — сначала доклад, а танцы потом.

О параметрах, аргументах, опциях, операндах и хороших манерах

Разберемся по-началу с эпиграфом или скорее антиэпиграфом. Во-первых, входные параметры нужны для работы не только сложных программ. Сегодня мы с этим столкнемся. Во-вторых, параметры называют опциями или аргументами не по желанию и не по щучьему велению. А по стандарту POSIX 1003.2.

Параметром называется некоторый объект, имеющий значение. Параметры могут обозначаться именем, номером или специальными символами. Переменной называется параметр, обозначаемый именем. [2]
Параметры отделяются друг от друга при помощи разделительных символов: пробела, табуляции и перевода строки.

Синтаксис команды в самом общем виде такой:

command [-a] [-b option_argument] [operand ...]

Команда начинается с названия — command, все что идет после ее названия это параметры программы (кстати, имя команды тоже параметр, но уже параметр командной строки shell'а). Параметры программы еще называют аргументами, а среди них, в свою очередь, различают: опциии, аргументы опций и операнды.

Аргумент, состоящий из знака минус, за которым следует одна буква или цифра, называется опцией. Опции обычно задают режим работы программы. Еще их называют флагами, ключами или «кто как хочет». За некоторыми опциями могут следовать параметры, относящиеся только к этому флагу. Такие параметры называются аргументами опций. Параметры, задаваемые после последней опции и ее аргумента, называются операндами и обычно задают объекты для обработки.

Для записи имен команд и их аргументов установлен ряд правил, которые приведены ниже. Эти правила предназначены, прежде всего, для авторов новых команд. Некоторые существующие команды, в силу прежде всего исторических причин, не полностью удовлетворяют этим правилам

  1. Длина имени команды должна составлять от двух до девяти символов.
  2. Имя команды записывается только строчными буквами и цифрами.
  3. Имя опции должно состоять из одного алфавитно-цифрового символа.
  4. Имени опции должен предшествовать разделительный символ '-'.
  5. Если у опциий нет аргументов, то они могут группироваться за одним разделителем '-'. (см. пример 1)
  6. Опция и ее первый аргумент должны указываться раздельно.
  7. Аргумент опции не может быть опущен, если задана соответствующая опция.
  8. Если для опции задается несколько аргументов, то они должны быть представлены как один параметр. Для этого их перечисляют через запятую, либо берут в кавычки, если в качестве разделителя используются пробелы или табуляции. (см. пример 2)
  9. В командной строке все опции указываются перед операндами.
  10. Аргумент '--' может быть использован как признак конца опциий. Его нельзя использовать в качестве опции или операнда. (см. пример 3)
  11. Порядок опций не должен быть существенным.
  12. Порядок операндов может быть существенным; интерпретация операндов в зависимости от их позиции определяется конкретной командой.
  13. Одиночный символ '-' может быть использован как аргумент только вместо имени файла для обозначения стандартного ввода или вывода.

Кроме того, существуют опции в стиле GNU /GNU style long named options/. Когда они появились и кто их придумал не знаю. Начинаются они с двух минусов и состоят из нескольких символов. Аргументы такой опции указываются через знак равенства после ее имени. Во многих утилитах для длинных опций имеются их короткие эквиваленты и наоборот (например опции --multi-volume и -M утилиты tar).

Пример 1.

ls -l -a -h
# группируем опции без аргументов:
ls -lah

Пример 2.

mount -o uid=fred,gid=users /dev/fd0
# группируем аргументы опции -o, см. также правило 6

Пример 3.

rm -- -i
# удаляем файл -i в текущем каталоге

Когда в ответ на системное приглашение shell вы вводите какие-нибудь данные и завершаете их ввод нажатием клавиши Enter, командный интерпретатор выполняет над ними ряд действий, а именно:

  1. замену выражений в фигурных скобках*,
  2. замену тильды*,
  3. подстановку значений переменных и параметров,
  4. подстановку значений арифметических выражений*,
  5. подстановку выполнения результатов выполнения команд,
  6. разбиение слов,
  7. подстановку имен файлов.
*) только в bash

О каждой из этих операций мы поговорим в свое время отдельно и довольно подробно. Сегодня сконцентрируемся лишь на результатах их работы — словах. (Слово это последовательность символов, рассматриваемая командным интерпретатором как единое целое. Также называется лексемой /token/.) Первое слово командный интерпретатор рассматривает как имя команды, а остальные слова — как ее аргументы.

От слов к ddелу

Когда требуется определить скорость обмена данными, протестировать диск или ленту, довольно часто возникает необходимость в файле значительного размера. Его довольно просто создать используя утилиту dd:

dd if=/dev/zero of=1024MB bs=1M count=1024

Как не трудно заметить, опции команды dd вышеупомянутым правилам соответствуют слабо, а точнее — никак. Но это не нарочно, а по историческим причинам. То есть вначале была dd, а правила — потом.

Что же происходит? Опция bs говорит утилите, что размер блока ввода/вывода будет равен одному мегабайту. С помощью флага count мы заставляем ее считать и записать по 1024 блока данных, то есть 1 гигабайт. Опция of определяет, что запись будет осуществляться в файл по имени 1024MB. Опция if говорит, что данные будем брать из файла /dev/zero. Учтите, что этот файл неиссякаемый источник данных — аналог неразменного рубля и скатерти самобранки. Называется он zero от того, что все биты, получаемых из него байт, установлены в нули.

Чтобы не вводить эту длинную команду снова и снова, поместите ее в файл mkfile и установите ему разрешения на выполнение:

chmod +x mkfile

Давайте теперь разберемся как заставить наш сценарий создавать файлы произвольного размера. Можно, например, передать сценарию желаемый размер файла в виде аргумента: mkfile <размер_в_МБ>. Но как получить доступ к значениям аргументов внутри сценария? Наиболее простой способ — использовать позиционные переменные. Значения этим переменным присваиваются на основе аргументов, переданных сценарию при запуске. Имя каждой из них состоит всего из одной цифры. Это значит, что на значение первого позиционного параметра мы сможем сослаться как на $1, второго — $2 и так до $9. Дальше возможны варианты. Займемся ими когда позиционных параметров будет действительно много.

Усовершенствованный сценарий mkfile будет выглядеть так:

dd if=/dev/zero of=$1MB bs=1M count=$1


Вот и все. Для домашнего чтения могу предложить статью Сергея Романюка «Сюрпризы POSIX».


1. Рассылка «Программирование под Linux»
Выпуск «Передача опций в программу - getopt»

2. Беляков М. И., Рабовер Ю. И., Фридман А. Л.
Мобильная операционная система
М.: Радио и связь, 1991


Ведущий рассылки Big Shadow

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное