Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программирование > Bash

Bash - командная оболочка

2004 г
Брайан Фокс (Brian Fox), Free Software Foundation,
Чет Реми (Chet Ramey), Case Western Reserve University
перевод В. Кравчук

содержание

ПАРАМЕТРЫ

Параметр - это сущность, хранящая значение. Это может быть имя, число или один из специальных символов, перечисленных ниже в разделе "Специальные параметры". В контексте интерпретатора, переменная - это параметр, обозначаемый именем.

Параметр устанавливается, если ему присвоено значение. Пустая строка является допустимым значением. После того, как переменная установлена, она может быть удалена только с помощью встроенной команды unset (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).

Значение переменной может быть присвоено с помощью оператора вида

имя=[значение]

Если значение не задано, переменной присваивается пустая строка. Во всех значениях выполняется замена тильды, подстановка значений параметров и переменных, обработка строк, подстановка результатов выполнения команд, арифметические вычисления и удаление символов маскировки (см. раздел "ОБРАБОТКА" ниже). Если для переменной установлен атрибут целочисленная (integer) (см. declare в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже), ее значение арифметически вычисляется, даже если арифметическое вычисление $((...)) не указано явно (см. подраздел "Арифметическое вычисление" ниже). Разбиение на слова не выполняется, за исключением значения "$@", как объяснено ниже в подразделе "Специальные параметры". Подстановка имен файлов не выполняется.

    Позиционные параметры

Позиционный параметр - это параметр, обозначаемый одной или несколькими цифрами, кроме цифры 0. Позиционным параметрам значения присваиваются на основе аргументов, переданных при вызове командного интерпретатора, и могут быть переприсвоены с помощью встроенной команды set. Позиционным параметрам нельзя присваивать значения с помощью операторов присваивания. Позиционные параметры временно заменяются при выполнении функции командного интерпретатора (см. раздел "ФУНКЦИИ" ниже).

Когда позиционный параметр состоит из нескольких цифр, его надо брать в скобки (см. раздел "ОБРАБОТКА" ниже).

    Специальные параметры

Командный интерпретатор обрабатывает ряд параметров специальным образом. Можно только ссылаться на значения этих параметров - присваивания им не разрешены.

* Заменяется позиционными параметрами, начиная с первого. Когда такая замена выполняется в двойных кавычках, результат будет одним словом, в котором значения параметров разделены первым символом значения специальной переменной IFS. То есть, "$*" эквивалентно "$1c$2c...", где c - первый символ значения переменной IFS. Если переменная IFS не установлена, значения параметров разделяются пробелами. Если переменная IFS имеет пустое значение, значения параметров просто конкатенируются, без разделителей.
@ Заменяется позиционными параметрами, начиная с первого. Когда такая замена выполняется в двойных кавычках, каждый параметр заменяется отдельным словом. То есть, "$@" эквивалентно "$1" "$2" ... Когда позиционных параметров нет, "$@" и $@ заменяются пустой строкой (т.е. они просто удаляются).
# Заменяется десятичным значением количества позиционных параметров.
? Заменяется статусом последнего выполненного в приоритетном режиме конвейера.
- Заменяется флагами текущих опций, заданных при вызове, с помощью встроенной команды set или установленных самим командным интерпретатором (как, например, опция -i).
$ Заменяется идентификатором процесса командного интерпретатора. В порожденном командном интерпретаторе, запущенном с помощью (), заменяется идентификатором процесса основного интерпретатора, а не порожденного.
! Заменяется идентификатором последнего процесса, запущенного в фоновом (асинхронном) режиме.
0 Заменяется именем командного интерпретатора или сценария. Это значение устанавливается при инициализации командного интерпретатора. Если bash вызван с командным файлом, $0 будет установлен равным имени этого файла. Если bash запущен с опцией -c, $0 получает значение первого аргумента после строки, которую надо выполнить, если он задан. В противном случае, этот специальный параметр получает значение имени файла, использованного для вызова bash, которое задается нулевым аргументом.
_ При запуске командного интерпретатора устанавливается равным полному имени файла (absolute file name) командного интерпретатора или выполняемого сценария, переданного в списке аргументов. В последствии, заменяется последним аргументом предыдущей команды, с учетом всех замен. Также устанавливается равным полному имени файла каждой выполняемой внешней команды и помещается в среду, экспортируемую для этой команды. При проверке почты этот параметр содержит имя проверяемого файла почты.
    Переменные командного интерпретатора

Командный интерпретатор устанавливает следующие переменные:

PPID Идентификатор родительского процесса для командного интерпретатора. Эта переменная доступна только для чтения.
PWD Текущий рабочий каталог, установленный с помощью команды cd.
OLDPWD Предыдущий рабочий каталог, который был установлен с помощью команды cd.
REPLY Устанавливается равной значению, прочитанному встроенной командой read, при вызове ее без аргументов.
UID Идентификатор текущего пользователя - устанавливается при запуске командного интерпретатора. Эта переменная доступна только для чтения.
EUID Эффективный идентификатор текущего пользователя - устанавливается при запуске командного интерпретатора. Эта переменная доступна только для чтения.
GROUPS Переменная-массив, содержащая список групп, в которые входит текущий пользователь. Эта переменная доступна только для чтения.
BASH Полное имя файла, использованное для вызова данного экземпляра bash.
BASH_VERSION Строка, описывающая версию данного экземпляра bash.
BASH_VERSINFO Доступный только для чтения массив, элементы которого содержат информацию о версии для данного экземпляра bash. Элементы массива имеют следующие значения:
BASH_VERSINFO[0] Главный номер версии (релиз).
BASH_VERSINFO[1] Второстепенный номер версии (версия).
BASH_VERSINFO[2] Уровень исправлений.
BASH_VERSINFO[3] Версия сборки.
BASH_VERSINFO[4] Статус релиза (например, beta1).
BASH_VERSINFO[5] Значение переменной MACHTYPE.
SHLVL Увеличивается на 1 при каждом запуске порожденного интерпретатора bash.
RANDOM При каждом обращении к этому параметру генерируется случайное число от 0 до 32767. Конкретная последовательность случайных чисел может быть проинициализирована путем присваивания значения переменной RANDOM. Если переменная RANDOM удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается.
SECONDS При каждом обращении к этому параметру возвращается количество секунд, прошедших с момента вызова данного командного интерпретатора. Если переменной SECONDS присваивается значение, при последующем обращении будет получено количество секунд, прошедшее с момента присваивания, плюс присвоенное значение. Если переменная SECONDS удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается.
LINENO При каждом обращении к этому параметру командный интерпретатор подставляет десятичное число, представляющее порядковый номер текущей строки (начиная с 1) в сценарии или функции. При вызове не из сценария или функции, не гарантируется подстановка осмысленного значения. Если переменная LINENO удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается.
HISTCMD Исторический номер команды, или индекс текущей команды в списке выполненных команд. Если переменная HISTCMD удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается.
DIRSTACK Переменная-массив (см. раздел "Массивы" далее), в которой хранится текущее содержимое стека каталогов. Каталоги находятся в стеке в том же порядке, в котором выдаются встроенной командой dirs. Путем присваивания элементам этого массива можно изменять каталоги, уже находящиеся в стеке, но для добавления и удаления каталогов надо использовать встроенные команды pushd и popd. Присваивание значения этой переменной не меняет текущий каталог. Если переменная DIRSTACK удаляется с помощью unset, она теряет свои специальные свойства, даже если в дальнейшем переустанавливается.
PIPESTATUS Переменная-массив (см. раздел "Массивы" далее), содержащая список значений статусов выхода процессов в последнем выполненном в приоритетном режиме конвейере (который может состоять и всего из одной команды).
OPTARG Значение последнего аргумента-опции, обработанного встроенной командной getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).
OPTIND Индекс следующего аргумента, который должен быть обработан встроенной командой getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже).
HOSTNAME Автоматически устанавливается равной имени текущего хоста.
HOSTTYPE Автоматически устанавливается равной строке, уникально описывающей тип машины, на которой выполняется bash. Стандартное значение зависит от системы.
OSTYPE Автоматически устанавливается равной строке, описывающей операционную систему, на которой выполняется командный интерпретатор bash. Стандартное значение зависит от системы.
MACHTYPE Автоматически устанавливается равной строке, полностью описывающей тип системы, на которой выполняется bash, в стандартном для GNU формате процессор-компания-система. Стандартное значение зависит от системы.
SHELLOPTS Список установленных опций командного интерпретатора через двоеточие. Каждое слово в списке - допустимый аргумент для опции -o встроенной команды set (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Опции, упоминающиеся в списке SHELLOPTS, совпадают с выдаваемыми как установленные командой set -o. Если эта переменная экспортирована в среду при запуске командного интерпретатора bash, все упомянутые в списке опции будут установлены до чтения любых файлов начального запуска. Эта перменная доступна только для чтения.

Следующие переменные используются командным интерпретатором. В некоторых случаях bash присваивает переменным стандартные значения; эти случаи указаны ниже.

IFS Внутренний разделитель полей (Internal Field Separator), используемый для выделения слов после всех подстановок и для разбиения на слова строк, прочитанных с помощью встроенной команды read. Стандартное значение - "<пробел><табуляция><перевод строки>".
PATH Путь поиска команд. Это список каталогов через двоеточие, в которых командный интерпретатор ищет команды (см. раздел "ВЫПОЛНЕНИЕ КОМАНД" ниже). Стандартный путь поиска зависит от системы и задается администратором, устанавливающим bash. Типичное значение: "/usr/gnu/bin :/usr/local/bin
:/usr/ucb:/bin:/usr/bin:.
".
HOME Начальный каталог текущего пользователя; стандартный аргумент для встроенной команды cd. Значение этой переменной также используется при замене тильды.
CDPATH Путь поиска для команды cd. Это список каталогов через двоеточие, в которых командный интерпретатор ищет целевые каталоги, указанные по имени в команде cd. Пример возможного значения - ".:~:/usr".
BASH_ENV Если этот параметр установлен при выполнении командным интерпретатором bash сценария, его значение интерпретируется как имя файла, содержащего команды инициализации интерпретатора, аналогично ~/.bashrc. В значении BASH_ENV перед интерпретацией выполняется подстановка значений параметров, подстановка результатов выполнения команд и арифметические вычисления. Переменная PATH не используется для поиска результирующего имени файла.
MAIL Если этот параметр установлен равным имени файла и не установлена переменная MAILPATH, bash информирует пользователя о получении электронной почты в указанный файл.
MAILCHECK Задает частоту проверки (в секундах) электронной почты командным интерпретатором bash. Стандартное значение - 60 секунд. Когда приходит время проверять наличие новой почты, командный интерпретатор делает это перед выдачей первичного приглашения. Если эта переменная не установлена, проверка почты командным интерпретатором отключается.
MAILPATH Список имен файлов через двоеточие, в которых нужно проверять наличие новых почтовых сообщений. Можно задавать сообщение, которое должно выдаваться при поступлении почты в конкретный файл, отделяя сообщение от имени файла вопросительным знаком (?). В тексте этого сообщения метасимвол $_ заменяется именем текущего файла почты. Например:

MAILPATH='/usr/spool/mail/bfox?"You have mail"
:~/shell-mail?"$_ has mail!"'

Командный интерпретатор bash поддерживает стандартное значение для этой переменной, но используемое при этом местонахождение файлов почты пользователя зависит от системы (например, /usr/spool/mail/$USER).

PS1 Значение этого параметра обрабатывается (см. раздел "ПРИГЛАШЕНИЯ" ниже) и используется для установки строки первичного приглашения. Стандартное значение - "\s-\v\$ ".
PS2 Значение этого параметра обрабатывается, как и PS1, и используется для установки строки вторичного приглашения. Стандартное значение - "> ".
PS3 Значение этого параметра используется в качестве приглашения для команды select (см. раздел "СИНТАКСИС КОМАНД" выше).
PS4 Значение этого параметра обрабатывается, как и PS1, и выдается перед каждой командой, показываемой интерпретатором bash в ходе трассировки выполнения. Первый символ PS4 повторяется необходимое количество раз, показывая уровень вложенности. Стандартное значение - "+".
TIMEFORMAT Значение этого параметра используется в качестве строки, задающей формат выдачи информации о времени выполнения для конвейеров, перед которыми задано зарезервированное слово time. Символ % начинает управляющую последовательность, заменяемую значением времени или другой информацией. Управляющие последовательности имеют следующие значения (в квадратных скобках представлены необязательные части):
%% Символ %.
%[p][l]R Время выполнения, в секундах.
%[p][l]U Количество секунд работы процессора в пользовательском режиме.
%[p][l]S Количество секунд работы процессора в системном режиме.
%P Процент использования процессора, вычисляемый как (%U + %S) / %R.
Необязательный параметр p - это цифра, задающая точность, количество знаков (долей секунды) после запятой. Значение 0 отменяет выдачу долей секунды. Максимальная точность - три знака после запятой; значения p больше 3 заменяются на 3. Если p не задано, используется значение 3.

Необязательный параметр l задает длинный формат, включая минуты, в виде MMmSS.FFs. Значение праметра p определяет, включаются доли секунды или нет.

Если эта переменная не установлена, bash действует так, как если бы она имела значение $'\nreal\t%3lR\nuser\t%3lU\nsys%3lS'. Если установлено пустое значение, информация о времени выполнения не выдается. При выводе строки по формату добавляется перевод строки.

HISTSIZE Количество команд, которые необходимо запоминать в списке истории (см. раздел "ИСТОРИЯ КОМАНД" ниже). Стандартное значение - 500.
HISTFILE Имя файла, в котором сохраняется история команд (см. раздел "ИСТОРИЯ КОМАНД" ниже). Стандартное значение - ~/.bash_history. Если эта переменная не установлена, история команд не сохраняется при завершении работы интерактивного командного интерпретатора.
HISTFILESIZE Максимальное количество строк, содержащееся в файле истории. Если этой переменной присвоено значение, файл истории, при необходимости, усекается, и будет содержать не больше, чем указанное количество строк. Стандартное значение - 500. Файл истории также усекается до этого размера после записи при выходе из интерактивного командного интерпретатора.
OPTERR Если имеет значение 1, bash показывает сообщения об ошибках, выдаваемые встроенной командой getopts (см. раздел "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА" ниже). Переменная OPTERR инициализируется значением 1 при каждом вызове командного интерпретатора или выполнении сценария.
LANG Используется для определения локали для всех категорий, не заданных явно с помощью переменной, имя которой начинается с LC_.
LC_ALL Эта переменная переопределяет значение переменной LANG и всех остальных переменных LC_, задающих категорию локали.
LC_COLLATE Эта переменная задает порядок сортировки, используемый при сортировке полученных по шаблону имен файлов, и определяет интерпретацию диапазонов, классов эквивалентостей и правила сравнения символов для подстановки имен файлов и сопоставления с образцом.
LC_CTYPE Эта переменная определяет интерпретацию символов и принадлежность символов к определенному классу для подстановки имен файлов и сопоставления с образцом.
LC_MESSAGES Эта переменная определяет локаль, используемую для обработки строк в двойных кавычках, перед которыми указан символ $.
PROMPT_COMMAND Если значение задано, оно выполняется как команда перед выдачей каждого первичного приглашения.
IGNOREEOF Управляет действием командного интерпретатора при получении символа конца файла (EOF) как единственного символа в строке. Если эта переменная установлена, ее значение интерпретируется как количество подряд идущих символов EOF, с которых должна начинаться строка, чтобы в результате работа командного интерпретатора bash завершилась. Если переменная существует, но не имеет числового значения или не имеет значения вообще, по умолчанию используется значение 10. Если эта переменная не существует, EOF означает конец входных данных для командного интерпретатора.
TMOUT Если установлено значение больше нуля, оно интерпретируется как количество секунд ожидания ввода после выдачи первичного приглашения. Командный интерпретатор bash завершает работу по истечении этого времени, если не введена команда.
FCEDIT Задает стандартный редактор для встроенной команды fc.
FIGNORE Список суффиксов через двоеточие, которые необходимо игнорировать при завершении имен файлов (см. раздел "БИБЛИОТЕКА READLINE" ниже). Имя файла, суффикс которого совпадает с одним из указанных в FIGNORE значений, исключается из списка соответствующих имен файлов. Пример значения - ".o:~".
GLOBIGNORE Список шаблонов через двоеточие, задающих набор имен файлов, которые надо игнорировать при подстановке имен. Если имя файла, соответствующее шаблону, также соответствует одному из шаблонов в GLOBIGNORE, оно удаляется из списка соответствующих.
INPUTRC Имя файла начального запуска readline, переопределяющего стандартные установки в файле ~/.inputrc (см. раздел "БИБЛИОТЕКА READLINE" ниже).
HISTCONTROL Если имеет значение ignorespace, строки, начинающиеся символом пробела, не попадают в список выполненных команд. Если имеет значение ignoredups, строки, совпадающие с последней выполненной командой, в список выполненных команд не попадают. Значение ignoreboth сочетает действие обеих представленных опций. Если переменной нет или она имеет какое-то другое значение, кроме перечисленных выше, все строки, прочитанные синтаксическим анализатором, сохраняются в списке истории, с учетом значения переменной HISTIGNORE. Действие этой переменной переопределяется переменной HISTIGNORE. Вторая и следующие строки многострочной составной команды не проверяются, и добавляются в список истории независимо от значения HISTCONTROL.
HISTIGNORE Список шаблонов через двоеточие, используемых для принятия решения о сохранении командных строк в списке истории. Каждый шаблон привязывается к началу строки и должен задавать всю строку ('*' неявно не добавляется). Каждый шаблон сравнивается со строкой после проверок, задаваемых переменной HISTCONTROL. Кроме обычных символов сопоставления с образцом в командном интерпретаторе, символ '&' сопоставляется с предыдущей строкой в списке истории. Символ '&' можно экранировать с помощью обратной косой. Перед сопоставлением обратная косая убирается. Вторая и последующая строки составной многострочной команды не проверяются и добавляются в список истории независимо от значения переменной HISTIGNORE.
histchars Два или три символа, управляющих подстановкой и разбиением на лексемы уже выполненных команд (см. раздел "ПОДСТАНОВКА КОМАНД ИЗ СПИСКА ВЫПОЛНЕННЫХ" ниже). Первый символ - это символ подстановки из списка, который означает начало работы со списком истории. Обычно это символ '!'. Второй символ - это символ быстрой подстановки, используемый для быстрого повторения предыдущей введенной команды, с подстановкой указанной строки вместо другой, заданной в этой команде. По умолчанию используется символ '^'. Необязательный третий символ - это символ, указывающий, если является первым символом слова, что остаток строки - это комментарий. Обычно в этом качестве используется символ '#'. Символ комментария для списка истории приводит к отказу от подстановки из истории для оставшихся слов в командной строке. Он не обязательно приводит к обработке синтаксическим анализатором оставшейся части строки как комментария.
HOSTFILE Содержит имя файла того же формата, что и файл /etc/hosts, который будет читаться при необходимости подстановки имени хоста. Этот файл можно менять интерактивно; при следующей попытке подстановки имени хоста bash добавит содержимое нового файла к уже существующей базе данных.
auto_resume Эта переменная управляет взаимодействием командного интерпретатора с пользователем и средствами управления заданиями. Если она установлена, простые команды из одного слова и без перенаправлений рассматриваются как указатели возможного возобновления существующих остановленных заданий. Неоднозначность не допускается; если с введенной строки начинается более одного задания, выбирается последнее по времени приостановки задание. Имя остановленного задания, в этом контексте, - это командная строка, использовавшаяся для его запуска. Если эта переменная имеет значение exact, введенная строка должна точно совпадать с именем остановленного задания; Если же задано значение substring, введенная строка должна быть подстрокой имени остановленного задания. Это аналогично по возможностям идентификатору задания %? (см. раздел "УПРАВЛЕНИЕ ЗАДАНИЯМИ" ниже). Если установлено любое другое значение, введенная строка должна быть префиксом имени остановленного задания; это аналогично по возможностям идентификатору задания %.
    Массивы

Командный интерпретатор 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 делает эту подстановку путем выполнения команды и замены конструкции подстановки содержимым стандартного выходного потока команды, из которого удалены завершающие переводы строк. Встроенные переводы строк не удаляются, но они могут быть удалены при разбиении на слова. Подстановку результатов выполнения команды $(cat file) можно заменить эквивалентной, но более быстрой: $(< file).

При использовании старой формы подстановки в обратных апострофах обратная косая интерпретируется как литерал, если только после нее не идут символы $, ` или \. Первый же обратный апостроф, не замаскированный обратной косой, завершает подставляемую команду. При использовании формы $(команда) все символы между круглыми скобками образуют команду - ни один не имеет специального значения.

Подстановка результатов выполнения команд может быть вложенной. Для задания вложенной подстановки в форме с обратными апострофами замаскируйте внутренние обратные апострофы обратными косыми.

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

    Подстановка значений арифметических выражений

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

$((выражение))

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

Вычисление выполняется по правилам, перечисленным ниже в разделе "ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ". Если выражение недопустимо, командный интерпретатор bash выдает сообщение о невозможности вычисления и подстановка не выполняется.

    Подстановка процессов

Подстановка процессов доступна в системах, поддерживающих именованные каналы (FIFO) или метод именования открытых файлов через /dev/fd. Она имеет вид <(список) или >(список). Процесс список запускается и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в /dev/fd. Имя этого файла передается в качестве аргумента текущей команде как результат подстановки. Если использована форма >(список), запись в файл будет давать входные данные процессу список. Если же использована форма <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.

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

    Разбиение на слова

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

Командный интерпретатор рассматривает каждый символ значения переменной IFS как разделитель и разбивает результаты подстановок на слова по этим символам. Если переменная IFS не установлена или ее значение - <пробел><табуляция><перевод строки>, т.е. стандартное, то любая последовательность подряд идущих символов из IFS считается разделителем слов. Если же переменная IFS имеет значение, отличающееся от стандартного, то последовательность пробельных символов (пробелов и символов табуляции) в начале и в конце слова игнорируется, если пробельные символы входят в значение IFS (их обобщенно называют пробельным символом IFS). Любые символы в значении IFS, не являющиеся пробельными, вместе с любыми идущими за ними пробельными символами IFS, ограничивают слово. Последовательность пробельных символов IFS также считается разделителем. Если переменная IFS имеет пустое значение, разбиение на слова не происходит.

Явные пустые строки ("" или '') оставляются. Не взятые в кавычки неявные пустые строки, получающиеся в результате подстановки параметров, не имеющих значения, удаляются. Если параметр, не имеющий значения, подставляется в двойных кавычках, получается пустая строка, и она остается в командной строке.

Учтите, что если не было подстановок, то и разбиение на слова не выполняется.

    Подстановка имен файлов

После разбиения на слова, если только не установлена опция -f, командный интерпретатор bash просматривает каждое слово в поисках символов *, ?, ( и [. Если найден любой из этих символов, слово считается шаблоном и заменяется упорядоченным по алфавиту списком имен файлов, соответствующих шаблону. Если соответствующие имена файлов не найдены и опция командного интерпретатора nullglob отключена, слово остается без изменений. Если опция nullglob установлена и соответствующие файлы не найдены, слово удаляется. Если включена опция командного интерпретатора nocaseglob, сопоставление выполняется без учета регистра алфавитных символов. Если шаблон используется для подстановки имен файлов, символ "." в начале имени или сразу после косой черты должен сопоставляться явно, если только не установлена опция интерпретатора dotglob. При сопоставлении имен файлов косые черты всегда должны сопоставляться явно. В других случаях символ "." обрабатывается как любые другие символы. См. описание опций командного интерпретатора nocaseglob, nullglob и dotglob ниже в разделе "ВСТРОЕННЫЕ КОМАНДЫ ИНТЕРПРЕТАТОРА".

Переменная командного интерпретатора GLOBIGNORE может использоваться для ограничения множества имен файлов, соответствующих шаблону. Если переменная GLOBIGNORE установлена, каждое сопоставившееся имя файла, соответствующее также одному из шаблонов, заданных в GLOBIGNORE, удаляется из списка сопоставившихся. Имена файлов "." и ".." игнорируются всегда, даже если установлена переменная GLOBIGNORE. Однако при установке переменной GLOBIGNORE автоматически устанавливается опция интерпретатора dotglob, так что все остальные имена файлов, начинающиеся с ".", будут подставлены. Для получения старого поведения - игнорирования имен файлов, начинающихся с ".", - задайте ".*" как один из шаблонов в переменной GLOBIGNORE. Опция dotglob отключается, если переменная GLOBIGNORE не установлена.

    Сопоставление с образцом

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

Специальные символы шаблона имеют следующие значения:

*
Соответствует любой строке, в том числе, пустой.
?
Соответствует любому одиночному символу.
[...]
Соответствует любому из символов в квадратных скобках. Пара символов, разделенная дефисом, задает диапазон; любой символ, лексически находящийся между этими двумя символами, включительно, будет соответствовать этой конструкции. Если сразу после [ идет символ ! или ^, то конструкции соответствует любой символ, не указанный в квадратных скобках. Для сопоставления с дефисом (-) его необходимо указать в квадратных скобках первым или последним. Для задания закрывающей квадратной скобки (]), ее необходимо указать как первый символ набора.

В квадратных скобках можно задавать классы символов с помощью конструкции [:класс:], где класс - один из следующих классов, определяемых стандартом POSIX.2:
alnum alpha ascii blank cntrl digit graph lower print punct space upper xdigit
Класс символов сопоставляется с любым символом, принадлежащим к этому классу.

В квадратных скобках можно задавать класс эквивалентности с помощью конструкции [=c=], соответствующей всем символам с тем же порядком сортировки (collation weight), определяемым текущей локалью, что и символ c.

В квадратных скобках конструкция [.символ.] соответствует символу с указанным порядком сортировки.

Если с помощью встроенной команды shopt установлена опция командного интерпретатора extglob, распознается ряд дополнительных операторов сопоставления с образцом. В следующем описании список_шаблонов - это список из одного или нескольких шаблонов через вертикальную черту (|). Составные шаблоны можно формировать из одного или нескольких следующих подшаблонов:

?(список_шаблонов)
Соответствует нулю или одному вхождению указанных шаблонов
*(список_шаблонов)
Соответствует нулю или более вхождений указанных шаблонов
+(список_шаблонов)
Соответствует одному или оболее вхождений указанных шаблонов
@(список_шаблонов)
Соответствует ровно одному вхождению указанных шаблонов
!(список_шаблонов)
Соответствует любой строке, кроме соответствующей одному из указанных шаблонов.
    Удаление кавычек

После выполнения всех перечисленных выше подстановок все незамаскированные вхождения символов \, ' и ", не являющиеся результатом этих подстановок, удаляются.

содержаниеназадвперед

Главная > Программирование > Bash