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

Страницы справочного руководства ОС UNIX на русском man bash(1), часть 5


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

Выпуск 47

man bash(1), часть четвертая

Уважаемые подписчики! Этот выпуск - пятый в серии, посвященной командному интерпретатору bash. Перевод закончен вчера, 2 мая, по справочному руководству ОС Solaris 8.

Поскольку по правилам оформления рассылок в них не должно быть "висящих" гиперссылок, не все перекрестные ссылки в выпусках, посвященных bash, оформлены как гиперссылки. Когда перевод будет закончен, вы сможете скачать с сайта рассылки всю страницу в целом, со всеми необходимыми перекрестными и внешними ссылками.


bash(1)

    Массивы

Командный интерпретатор bash поддерживает одномерные массивы. Любая переменная может использоваться как массив; встроенная процедура declare позволяет объявить массив явно. Нет ограничения на рамер массива или требования непрерывности индексов. Массивы индексируются целыми числами, начиная с нуля.

Массив создается автоматически при присваивании любой переменной значения с помощью конструкции имя[индекс]=значение. Индекс обрабатывается как арифметическое выражение, которое должно иметь неотрицательное значение. Для явного объявления массива используется команда declare -a имя (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Конструкция declare -a имя[индекс] также поддерживается; индекс просто игнорируется. Для переменной типа массив можно задать атрибуты с помощью встроенных команд declare и readonly. Атрибут применяется ко всем элементам массива.

Присваивания массивам выполняются с помощью конструкций вида имя=(значение1 ... значениеn), где каждое значение имеет вид [индекс]=строка. Обязательно задавать только строку. Если необязательные квадратные скобки и индекс указаны, присваивание выполняется элементу с соответствующим индексом; в противном случае, в качестве индекса элемента используется индекс последнего элемента, которому было присвоено значение, плюс один. Индексация начинается с нуля. Эту же конструкцию присваивания можно использовать и во встроенной команде declare. Значения отдельным элементам массива присваиваются с помощью представленной выше конструкции имя[индекс]=значение.

На любой элемент массива можно сослаться с помощью конструкции ${имя[индекс]}. Фигурные скобки необходимы, чтобы избежать конфликтов при подстановке имен файлов. Если в качестве индекса указан символ @ или *, слово заменяется всеми элементами массива с указанным именем. Эти индексы интерпретируются по-разному только если слово указано в двойных кавычках. Если слово указано в двойных кавычках, конструкция ${имя[*]} заменяется одним словом, значение которого строится как значения каждого элемента массива, разделенные первым символом из значения переменной среды IFS, а конструкция ${имя[@]} заменяет каждый элемент массива имя отдельным словом. Когда массив пустой, ${имя[@]} заменяется пустой строкой. Это аналогично замене специальных параметров * и @ (см. подраздел "Специальные параметры" выше). Конструкция ${#имя[индекс]} заменяется длиной элемента ${имя[индекс]}. Если в качестве индекса указан символ * или @, подставляется количество элементов массива. Ссылка на переменную-массив без индекса эквивалентна ссылка на элемент с индексом ноль.

Для уничтожения массивов используется встроенная команда unset. Команда unset имя[индекс] уничтожает элемент массива с указанным индексом. Команда unset name, где name - имя массива, или unset имя[индекс], где индекс - * или @, удаляет весь массив.

Встроенные команды declare, local и readonly воспринимают опцию -a для указания массива. Встроенная команда read воспринимает опцию -a для присваивания массиву списка слов, прочитанных из станадартного входного потока. Встроенные команды set и declare выдают значения массивов так, что их можно повторно использовать в присваиваниях.

ЗАМЕНА

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

Замена выполняется в следующем порядке: замена выражений в фигурных скобках, замена тильды, подстановка значений переменных, параметров, арифметических выражений и результатов выполнения команд (слева направо), разбиение слов и подстановка имен файлов.

В системах, где это может поддерживаться, выполняется дополнительная замена - подстановка процессов.

Только замена выражений в фигурных скобках, разбиение слов и подстановка имен файлов может изменить количество слов в командной строке; при других заменах одно слово просто заменяется другим. Единственное исключение - подстановка "$@" и "${имя[@]}", как объяснялось выше (см. раздел "ПАРАМЕТРЫ").

    Замена выражений в фигурных скобках

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

Выражения в фигурных скобках могут быть вложенными. Результаты каждой замены не сортируются; порядок слева направо сохраняется. Например, конструкция a{d,c,b}e заменяется на 'ade ace abe'.

Замена выражений в фигурных скобках выполняется перед любыми другими заменами, и в результате сохраняются все символы, имеющие специальное значение для других замен. Эта замена - строго текстуальная. Командный интерпретатор bash никак не учитывает контекст подстановки или текст в фигурных скобках.

Корректное выражение в фигурных скобках должно содержать незамаскированные открывающую и закрывающую фигурную скобку и, по крайней мере, одну незамаскированную запятую. Любое некорректное выражение в фигурных скобках остается неизменным. Символ { или , может маскироваться обратной косой для предотвращения их интерпретации на этапе замены выражений в фигурных скобках.

Эта конструкция обычно используется для сокращенной записи группы строк с общим префиксом, более длинным чем в представленном выше примере:

mkdir /usr/local/src/bash/{old,new,dist,bugs}
или
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Замена выражений в фигурных скобках вносит небольшое рассогласование с историческими версиями sh. Командный интерпретатор sh не рассматривает открывающую и закрывающую фигурные скобки в слове специальным образом и просто сохраняет их. Командный интерпретатор bash удаляет фигурные скобки из слова при замене. Например, слово, введенное в sh как file{1,2}, остается без изменений. Это же слово заменяется парой слов file1 file2 после замены выражения в фигурных скобках в bash. Если требуется полная совместимость с sh, командный интерпретатор bash надо запускать с опцией +B или отключать с помощью опции +B команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).

    Замена тильды

Если слово начинается незамаскированным символом тильда (~), все символы до первой незамаскированной косой черты (или все символы, если незамаскированной косой черты в слове нет) считаются тильда-префиксом. Если ни один из символов тильда-префикса не замаскирован, его символы после тильды рассматриваются как возможное регистрационное имя. Если это регистрационное имя представляет собой пустую строку, тильда заменяется значением переменной HOME. Если переменная HOME не установлена, подставляется начальный каталог пользователя, выполняющего процесс командного интерпретатора. Если же тильда-префикс не пустой, подставляется начальный каталог соответствующего пользователя.

Если тильда-префикс имеет вид '~+', вместо него подставляется значение переменной PWD. Если тильда-префикс имеет вид '~-', вместо него подставляется значение переменной OLDPWD, если эта переменная установлена. Если среди символов после тильды в тильда-префиксе имеется число N, с необязательными префиксами '+' или '-', тильда-префикс заменяется соответствующим элементом из стека каталогов, который был бы выдан встроенной командой dirs при вызове с тильда-префиксом в качестве аргумента. Если символы после тильды содержат число без начального знака '+' или '-', предполагается '+'.

Если соответствующего регистрационного имени не существует или замену тиильды выполнить не удалось, исходное слово остается без изменений.

Присваивания значений переменным проверяются на наличие незамаскированных тильда-префиксов сразу после : или =. В этих случаях также выполняется замена тильды. Соответственно, можно использовать имена файлов с тильдами в присваиваниях переменным PATH, MAILPATH и CDPATH, и командный интерпретатор выполнит необходимые замены.

    Подстановка значений параметров

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

При использовании фигурных скобок, завершающей считается первая скобка '}', не замаскированная обратной косой, не входящая в строку в кавычках, встроенное арифметическое выражение или подставляемую команду, или в подстановку значения другого параметра.

${параметр}
Подставляется значение указанного параметра. Фигурные скобки необходимы, если параметр является позиционным и номер позиции состоит из нескольких цифр или когда после параметра идет символ, не входящий в его имя.

Если первый символ параметра - восклицательный знак, начинается косвенная подстановка. Командный интерпретатор bash использует значение переменной, имя которой задается остальной частью параметра, в качестве имени переменной, значение которой необходимо подставить, а не собственно значения. Это называется косвенной заменой.

В каждом из описанных ниже случаев в полученном слове выполняется замена тильды, подстановка значений параметров, подстановка результатов выполнения команд и вычисление арифметических выражений. Если не выполняется подстановка подстрок, bash проверяет, не является ли параметр не установленным или не имеет ли он пустого значения; если не указать двоеточие, проверяется только, установлен ли параметр.

${параметр:-слово}
Использовать стандартное значение. Если параметр не установлен или имеет пустое значение, подставляется значение указанного слова. Иначе подставляется значение параметра.
${параметр:=слово}
Присвоить стандартное значение. Если параметр не установлен или имеет пустое значение, параметр получает значение указанного слова. Затем подставляется значение параметра. Присваивать таким образом значения позиционным и специальным параметрам нельзя.
${параметр:?слово}
Выдавать ошибку если параметр не установлен или имеет пустое значение. Если параметр имеет пустое значение или не установлен, указанное слово (или стандартное сообщение, если слово не задано) выдается в стандартный поток ошибок и командный интерпретатор, если он не интерактивный, завершает работу. В противном случае, подставляется значение параметра.
${параметр:+слово}
Использовать альтернативное значение. Если параметр не установлен или имеет пустое значение, не подставляется ничего, в противном случае, подставляется указанное слово.
${параметр:m}
${параметр:m:n}
Подстановка подстрок. Подставляет символы значения параметра, начиная с указанного смещения m и вплоть до заданной длины n. Если длина не указана, подставляет символы с указанного смещения и до конца. В качестве длины и смещения можно задавать арифметические выражения (см. раздел "ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ" ниже). Длина должна быть неотрицательным числом. Если смещение - отрицательное число, оно отсчитывается с конца значения параметра. Если параметр - @, результат - n позиционных параметров, начиная с параметра m. Если параметр - массив с индексом @ или *, результат - n элементов массива, начиная с ${параметр[m]}. Идексация подстрок начинается с нуля, за исключением позиционных параметров, которые индексируются, начиная с 1.
${#параметр}
Подставляется длина значения параметра в символах. Если параметр - * или @, подставляется количество позиционных параметров. Если параметр - массив с индексом * или @, подставляется количество элементов массива.
${параметр#слово}
${параметр##слово}
Слово рассматривается как шаблон, аналогичный шаблону имен файлов. Если шаблон сопоставляется с началом значения параметра, то результатом будет значение параметра, из которого удалена самая короткая (в случае "#") или самая длинная (в случае "##") подстрока. Если параметр - @ или *, операция удаления шаблона применяется поочередно к каждому позиционному параметру и подставляется полученный в результате список. Если параметр - массив с индексом @ или *, операция удаления шаблона применяется поочередно к каждому элементу массива и подставляется полученный в результате список.
${параметр%слово}
${параметр%%слово}
Слово рассматривается как шаблон, аналогичный шаблону имен файлов. Если шаблон сопоставляется с конечной частью значения параметра, то результатом будет значение параметра, из которого удалена самая короткая (в случае "%") или самая длинная (в случае "%%") подстрока. Если параметр - @ или *, операция удаления шаблона применяется поочередно к каждому позиционному параметру и подставляется полученный в результате список. Если параметр - массив с индексом @ или *, операция удаления шаблона применяется поочередно к каждому элементу массива и подставляется полученный в результате список.
${параметр/шаблон/строка}
${параметр//шаблон/строка}
Шаблон задается аналогично шаблонам имен файлов. Самая длинная подстрока значения параметра, соответствующая шаблону, заменяется указанной строкой. В первом случае, заменяется только первое вхождение. Во втором случае, заменяются все вхождения шаблона. Если шаблон начинается с #, он должен сопоставляться начиная с начала значения параметра. Если же шаблон начинается с %, он должен сопоставляться с окончанием значения параметра. Если строка - пустая, соответсвующие шаблону подстроки удаляются и / после шаблона можно не указывать. Если параметр - @ или *, операция замены шаблона применяется поочередно к каждому позиционному параметру, и подставляется полученный в результате список. Если параметр - массив с индексом @ или *, операция замены шаблона применяется поочередно к каждому элементу массива и подставляется полученный в результате список.

В следующем выпуске

Очередная часть справочного руководства по bash(1). Выпуск ожидается во вторник, 7 мая.

С наилучшими пожеланиями,

  В.К.



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

В избранное