[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]

Руководство пользователя: Операционная система и устройства


Подстановка значений переменных и имен файлов в оболочке Bourne

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

Создание и подстановка переменных в оболочке Bourne описаны в следующих разделах:

Подстановка переменных в оболочке Bourne

В оболочке Bourne существует несколько способов создания переменных (т.е. присвоения строкового значения некоторому имени). Часть переменных, а также позиционные и ключевые параметры обычно задаются только в командной строке. Другие переменные - это просто имена, которым вы или оболочка можете присваивать строковые значения.

Пользовательские переменные

Оболочка распознает алфавитно-цифровые переменные, которым могут быть присвоены строковые значения. Для присвоения строкового значения некоторому имени введите:

Имя=Строка

Нажмите Enter.

Имя - это последовательность букв, цифр и знаков подчеркивания, начинающаяся со знака подчеркивания или буквы. Для того чтобы узнать значение, присвоенное переменной, поставьте знак доллара ($) перед именем переменной. Таким образом, при указании $Имя будет выдано значение Строка. Учтите, что по обеим сторонам знака равенства (=) не должно быть пробелов. (Указывать позиционные параметры в операторе присвоения нельзя. Информация об их применении приведена в разделе Позиционные параметры.) Вы можете ввести несколько операторов присвоения в командной строке, но учтите, что оболочка выполняет присвоение в обратном порядке, т.е. справа налево.

Если Строка заключена в двойные (") или одинарные (') кавычки, то оболочка будет рассматривать пробелы, знаки табуляции, точки с запятой и символы новой строки, указанные внутри строки, не как ограничители слов, а как обычные символы.

Если Строка заключена в двойные кавычки ("), то оболочка по-прежнему будет распознавать имена переменных, указанные в строке, и выполнять подстановку переменных, т.е. заменять ссылки на позиционные параметры и указанные со знаком доллара ($) имена переменных на соответствующие значения. Кроме того, в таких строках будет выполняться подстановка команд.

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

Ввод:           num=875
                number1="Add $num"
                number2='Add $num'
                echo $number1
Вывод:          Add 875
Ввод:           echo $number2
Вывод:          Add $num

После подстановки переменных пробелы не обрабатываются. Таким образом, следующие операторы присвоения дадут одинаковые значения в $first и $second:

first='a string with embedded blanks'
second=$first

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

Ввод:           a='This is a'
                echo "${a}n example"
Вывод:          This is an example
Ввод:           echo "$a test"
Вывод:          This is a test

Другие способы применения фигурных скобок в подстановках переменных описаны в разделе Условная подстановка.

Переменные, применяемые оболочкой

Ниже перечислены переменные, применяемые оболочкой. Оболочка задает только некоторые из них; вы можете задать или сбросить любые переменные:

CDPATH Задает путь поиска для команды cd (изменить каталог).
HOME Указывает имя начального каталога, т.е. каталога, который становится текущим после входа в систему. Эта переменная инициализируется программой login. Команда cd по умолчанию применяет значение переменной $HOME. Применение этой переменной вместо абсолютных имен позволяет каждому пользователю без изменений выполнять процедуру в своей среде из различных каталогов.
IFS Задает символы, которые могут служить внутренними разделителями поля и учитываются оболочкой при обработке пробелов; см. раздел Интерпретация пробелов). Первоначально в переменную IFS входят пробел, символ табуляции и символ новой строки.
LANG Определяет локаль, которая будет применяться, если переменная LC_ALL и соответствующая переменная среды (начинающаяся с LC_) не заданы. Дополнительная информация о локалях приведена в разделе "Описание локалей " в книге AIX 5L Version 5.1 Принципы управления системой: Операционная система и устройства.
LC_ALL Задает локаль, переопределяющую значения переменной среды LANG, а также всех переменных среды, начинающихся с LC_. Дополнительная информация о локалях и переменной среды LANG приведена в разделе "Описание локалей" в книге AIX 5L Version 5.1 Принципы управления системой: Операционная система и устройства.
LC_COLLATE Определяет последовательность упорядочения, применяемую при сортировке имен и выборе символов по шаблону. Дополнительная информация о локалях и переменной среды LANG приведена в разделе "Описание локалей" в книге AIX 5L Version 5.1 Принципы управления системой: Операционная система и устройства.
LC_CTYPE Определяет локаль для обработки байтов текстовых данных как символов (однобайтовых или многобайтовых), а также для проверки того, является ли данный символ буквой (класс алфавитных символов - alpha), и выбора символов по шаблону. Дополнительная информация о локалях приведена в разделе "Описание локалей " в книге AIX 5L Version 5.1 Принципы управления системой: Операционная система и устройства.
LC_MESSAGES Задает язык, на котором выдаются сообщения. Дополнительная информация о локалях и переменной среды LANG приведена в разделе "Описание локалей" в книге AIX 5L Version 5.1 Принципы управления системой: Операционная система и устройства.
LIBPATH Задает путь поиска общих библиотек.
LOGNAME Задает имя пользователя, под которым вы вошли в систему, помеченное как readonly в файле /etc/profile.
MAIL Указывает путь к файлу, с помощью которого функция почты проверяет поступление новой почты. Если эта переменная задана, то оболочка периодически проверяет, не изменился ли файл. Если да, причем файл не пуст, то оболочка выдает сообщение $MAILMSG. Переменная MAIL задается в файле .profile . Обычно пользователи команды mail присваивают этой переменной значение /usr/spool/mail/$LOGNAME.
MAILCHECK Интервал времени в секундах, через который оболочка проверяет поступление почты в файлах, заданных в переменных MAILPATH и MAIL. Значение по умолчанию - 600 секунд (10 минут). Если вы присвоите переменной MAILCHECK нулевое значение, то проверка будет выполняться перед каждой выдачей приглашения.
MAILMSG Сообщение, уведомляющее о поступлении почты. Если вы зададите пустую строку в переменной MAILMSG (MAILMSG=""), то сообщение выдаваться не будет.
MAILPATH Список имен файлов, разделенных двоеточиями. Если эта переменная задана, то оболочка будет информировать вас о поступлении почты в любой из файлов, перечисленных в этом списке. После любого имени файла вы можете ввести символ % и текст сообщения, которое должно выдаваться при поступлении почты в этот файл. По умолчанию оболочка выдает сообщение из переменной MAILMSG, а если она не задана, то сообщение [ВАМ ПРИШЛА ПОЧТА].

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

Переменная PATH обычно инициализируется в файле /etc/environment, и обычно ее значение равно /usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin. Вы можете сбросить значение этой переменной. Переменная PATH в вашем файле .profile содержит также каталог $HOME/bin и ваш текущий каталог.

Если вы создали каталог, специально предназначенный для какого-либо проекта, например, /project/bin, и хотите, чтобы прежде всего просматривался именно этот каталог, задайте переменную PATH следующим образом:

PATH=/project/bin:$PATH

Если вы хотите задать для переменной PATH значение, отличное от значения по умолчанию, то лучше всего сделать это в файле $HOME/.profile. Учтите, что в оболочке с ограничениями сбросить значение переменной PATH нельзя.

PS1 Задает основное приглашение системы. Интерактивная оболочка выдает его, когда ожидает ввода информации. Значение переменной PS1 по умолчанию - $ и пробел, для пользователей без прав доступа root.
PS2 Задает вспомогательное приглашение системы. Если оболочка обнаруживает символ новой строки в данных ввода и ожидает продолжения ввода, то она выдает приглашение, указанное в переменной PS2. Значение переменной PS2 по умолчанию - знак "больше" (> )   и пробел.
SHACCT Имя принадлежащего вам файла. Если эта переменная задана, то оболочка считывает учетную запись из файла для каждого выполняемого сценария оболочки. Для анализа собранных данных вы можете воспользоваться программами учета, такими как acctcom и acctcms.
SHELL Задает путь к программе оболочки. Эта переменная должна быть задана и экспортирована файлом $HOME/.profile для каждой оболочки с ограничениями.
TIMEOUT Время простоя (в минутах), после которого оболочка завершает работу. Если этой переменной присвоено значение, большее нуля, то оболочка автоматически завершает работу в случае, если в течение указанного времени в ответ на приглашение PS1 не будет введена ни одна команда. (Учтите, что оболочка может быть скомпилирована с жестким ограничением, которое нельзя превысить путем увеличения этого значения.) Нулевое значение означает неограниченное время простоя.

Предопределенные специальные переменные

Некоторые переменные в оболочке Bourne являются специальными. Ниже перечислены переменные, задаваемые только оболочкой:

$@ Выдает значения позиционных параметров, начиная с $1. Параметры будут разделены пробелами.

Если вы заключите символы $@ в двойные кавычки, то каждый позиционный параметр будет считаться отдельной строкой. Если позиционные параметры отсутствуют, то оболочка Bourne преобразует выражение в пустую строку без кавычек.

$* Выдает значения позиционных параметров, начиная с $1. Оболочка отделяет каждый параметр первым символом значения переменной IFS.

Если символы $* заключены в двойные кавычки, то выданные значения позиционных параметров также будут заключены в двойные кавычки. Как и в первом случае, значения параметров будут разделены первым символом переменной IFS.

$# Задает число позиционных параметров, переданных оболочке, без учета имени самой процедуры оболочки. Таким образом, переменная $# содержит номер последнего позиционного параметра. Эта переменная позволяет убедиться, что оболочке передано необходимое число аргументов. Учтите, что в оболочке будут доступны только позиционные параметры с $0 по $9. Дополнительная информация приведена в разделе "Позиционные параметры".
$? Выдает код завершения последней выполненной команды. Это десятичная строка. Большинство команд возвращают нулевое значение (код успешного завершения). Сама оболочка возвращает текущее значение переменной $? в качестве кода завершения.
$$ Указывает номер текущего процесса. Поскольку номера процессов уникальны, эта строка часто применяется для создания уникальных имен временных файлов.

Ниже приведен пример создания такого временного файла:

temp=/tmp/$$
ls >$temp
.
.
.
rm $temp
$! Задает номер последнего выполненного фонового процесса (процесс выполняется в фоновом режиме, если в конце команды его запуска указан символ & ).
$- Эта строка состоит из флагов выполнения, заданных в оболочке в данный момент.

Интерпретация пробелов

После того как оболочка выполнит подстановку переменных и команд, она просматривает результаты в поисках внутренних разделителей полей (определенных в переменной оболочки IFS). Оболочка разбивает строку на отдельные слова в тех местах, где стоят разделители. Затем она оставляет явные пустые аргументы ("" и '') и отбрасывает неявные пустые аргументы (полученные от параметров, у которых нет значений).

Условная подстановка

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

A=

bcd=""

Efg='' Присваивает пустую строку переменным A, bcd и Efg.
set '' "" Задает первый и второй позиционные параметры равными пустой строке и сбрасывает все остальные позиционные параметры.

Ниже приведен список выражений, с помощью которых можно выполнять условную подстановку:

${Переменная-Строка} Если переменная задана, то вместо этого выражения будет подставлено значение Переменной. Если нет, то выражение будет заменено на значение Строка.
${Переменная:-Строка} Если переменная задана и не пуста, то вместо этого выражения будет подставлено значение Переменной. Если нет, то выражение будет заменено на значение Строка.
${Переменная=Строка} Если переменная задана, то вместо этого выражения будет подставлено значение Переменной. Если нет, то Переменной будет присвоено значение Строка, после чего это значение будет подставлено вместо выражения. Присваивать таким образом значения позиционным параметрам нельзя.
${Переменная:=Строка} Если переменная задана и не пуста, то вместо этого выражения будет подставлено значение Переменной. Если нет, то Переменной будет присвоено значение Строка, после чего это значение будет подставлено вместо выражения. Присваивать таким образом значения позиционным параметрам нельзя.
${Переменная?Строка} Если переменная задана, то вместо этого выражения будет подставлено значение Переменной. Если нет, то будет выдано следующее сообщение:

Переменная: Строка

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

Переменная: параметр пуст или не задан
${Переменная:?Строка} Если переменная задана и не пуста, то вместо этого выражения будет подставлено значение Переменной. Если нет, то будет выдано следующее сообщение:

Переменная: Строка

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

Переменная: параметр пуст или не задан
${Переменная+Строка} Если переменная задана, то вместо этого выражения будет подставлено значение Строка. Если нет, то будет подставлена пустая строка.
${Переменная:+Строка} Если переменная задана и не пуста, то вместо этого выражения будет подставлено значение Строка. Если нет, то будет подставлена пустая строка.

При условной подстановке оболочка не вычисляет значение Строка до тех пор, пока не воспользуется им в качестве подставленной строки. Таким образом, в следующем примере оболочка выполнит команду pwd только в том случае, если переменная d не задана или пуста:

echo ${d:-`pwd`}

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

При запуске процедуры оболочки она неявно создает по одному позиционному параметру для каждого слова, указанного в командной строке. Слову в позиции 0 (имени процедуры) будет соответствовать параметр $0, следующему слову (первому параметру) - параметр $1, и т.д. до $9. Если в командной строке указано больше девяти параметров, воспользуйтесь встроенной командой shift.

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

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

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

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

Примечание: Оболочка Bourne не поддерживает подстановку имен файлов на основе соотношений эквивалентности символов.

Большинство символов в шаблоне будут соответствовать самим себе, однако вы можете указать и специальные символы подстановки. Такие символы перечислены ниже:

* Заменяет любую строку, в том числе пустую.
? Соответствует любому символу.
[ . . . ] Соответствует любому из заключенных в скобки символов.
[! . . . ] Соответствует любому символу, отличному от тех, что указаны после восклицательного знака в квадратных скобках.

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

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

.*file

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

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

Классы символов

При создании шаблонов вы можете также применять классы символов:

[[:класс_символов:]]

Данный формат обозначает любой символ, принадлежащий указанному классу. Набор классов соответствует функциям ctype. Эти классы перечислены ниже:

Класс символов Определение
alnum Алфавитно-цифровые символы
alpha Строчные и прописные буквы
пробел Пробел или символ горизонтальной табуляции
cntrl Управляющие символы
digit Цифры
graph Графические символы
lower Строчные буквы
print Печатаемые символы
punct Знаки препинания
space Пробел, символ горизонтальной табуляции, символ возврата каретки, символ новой строки, символ вертикальной табуляции или символ перевода страницы
upper Прописные символы
xdigit Шестнадцатиричные цифры


[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]