Оболочка 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. |
Указывает путь к файлу, с помощью которого функция почты проверяет поступление новой почты. Если эта переменная задана, то оболочка периодически проверяет, не изменился ли файл. Если да, причем файл не пуст, то оболочка выдает сообщение $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). Оболочка разбивает строку на отдельные слова в тех местах, где стоят разделители. Затем она оставляет явные пустые аргументы ("" и '') и отбрасывает неявные пустые аргументы (полученные от параметров, у которых нет значений).
Обычно оболочка заменяет выражение $Переменная на строковое значение, присвоенное переменной Переменная, если оно есть. Однако вы можете выполнить и условную подстановку, т.е. подстановку в зависимости от того, задано значение переменной или нет, пустое оно или нет, или обоих условий. По определению переменная считается заданной, если ей когда-либо присваивалось значение. Значением переменной может быть пустая строка, которую можно присвоить любым из следующих способов:
Efg='' | Присваивает пустую строку переменным A, bcd и Efg. |
set '' "" | Задает первый и второй позиционные параметры равными пустой строке и сбрасывает все остальные позиционные параметры. |
Ниже приведен список выражений, с
помощью которых можно выполнять условную подстановку:
При условной подстановке оболочка не вычисляет значение Строка до тех пор, пока не воспользуется им в качестве подставленной строки. Таким образом, в следующем примере оболочка выполнит команду pwd только в том случае, если переменная d не задана или пуста:
echo ${d:-`pwd`}
При запуске процедуры оболочки она неявно создает по одному позиционному параметру для каждого слова, указанного в командной строке. Слову в позиции 0 (имени процедуры) будет соответствовать параметр $0, следующему слову (первому параметру) - параметр $1, и т.д. до $9. Если в командной строке указано больше девяти параметров, воспользуйтесь встроенной командой shift.
Вы можете сбросить значения позиционных параметров явно, воспользовавшись встроенной командой set.
Примечание: Если аргумент в некоторой позиции не задан, то соответствующему позиционному параметру присваивается пустое значение. Позиционные параметры глобальны и могут быть переданы вложенным процедурам оболочки.
В роли параметров команды часто выступают имена файлов. Вы можете автоматически создать список имен файлов, которые будут параметрами командной строки. Для этого укажите символ, распознаваемый оболочкой в качестве шаблона. Если команда содержит такой символ, оболочка заменит его на имена файлов.
Примечание: Оболочка Bourne не поддерживает подстановку имен файлов на основе соотношений эквивалентности символов.
Большинство символов в шаблоне
будут соответствовать самим себе, однако вы можете указать и специальные
символы подстановки. Такие символы перечислены ниже:
Пара символов, разделенных дефисом (-), которая указана в квадратных скобках, задает множество всех промежуточных символов согласно двоичной последовательности упорядочения символов.
На соответствие шаблону накладываются определенные ограничения. Если имя файла начинается с точки (.), то он соответствует только тому шаблону, который также начинается с точки. Например, символ * соответствует именам файлов myfile и yourfile, но не соответствует именам .myfile и .yourfile. Для таких имен файлов нужно задать шаблон следующего вида:
.*file
Если нет ни одного имени файла, соответствующего шаблону, то в качестве результата поиска возвращается сам шаблон.
В именах файлов и каталогов не должны содержаться символы * , ? , [ или ], так как при сравнении с шаблоном они могут вызвать бесконечную рекурсию (бесконечный цикл).
При создании шаблонов вы можете также применять классы символов:
[[:класс_символов:]]
Данный формат обозначает любой
символ, принадлежащий указанному классу. Набор классов соответствует
функциям ctype. Эти классы перечислены ниже: