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

Когда вызывается процедура Shell, то Shell сразу неявно создает позиционные параметры. Имя самой процедуры Shell в нулевой позиции в командной строке присваивается позиционному параметру $0. Первый аргумент команды называется $1 и т.д. Чтобы получить доступ к аргументам в позициях с номером больше 9, можно использовать команду shift. Например, следующую процедуру можно использовать для просмотра позиционных параметров и затем обрабатывать все необходимые файлы:

while test -n "$1" do case $1 in -a) A=aoption; shift;; -b) B=boption; shift;; -c) C=coption; shift;; -*) echo "bad option"; exit 1;; *) process rest of files esac done

Пользователь может явно передать необходимые значения этим позиционным параметрам с помощью команды set. Например, команда:

set abc def ghi

присваивает значение "abc" первому позиционному параметру $1, значение "def" - второму $2 и "ghi" - третьему $3. Нулевой позиционный параметр $0 нельзя переопределить таким способом - он всегда относится к имени процедуры Shell.


Переменные, определяемые пользователем

Интерпретатор Shell также распознает буквенно-цифровые переменные, которым присвоены текстовые значения. Простая команда присвоения имеет синтаксис:

имя=строка

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

A=$B B=abc

переменной А будет присвоено значение "abc".
Ниже приводятся примеры простых присвоений. Двойные кавычки с правой стороны команды присвоения позволяют указывать пробелы, знаки табуляции, символы перехода на новую строку и точки с запятой в присваиваемом тексте, а также выполнять подстановку переменных. Это значит, что при обнаружении позиционных параметров и других имен переменных, перед которыми стоит знак $, они будут заменяться на соответствующие значения, если они имеются. Одинарные кавычки подавляют подстановку переменных:

MAIL=/usr/mail/gas echovar="echo $1 $2 $3 $4" stars=***** asterisks='$stars'

В приведенных примерах переменной echovar присвоено значение строки, состоящей из слова echo и четырех позиционных параметров, разделенных пробелами. Вокруг последовательности звездочек, присваиваемых переменной stars, кавычек не требуется, т.к. их специальное значение здесь не действует. Обратите внимание, что переменной asterisks присвоено текстовое значение "$stars", а не "*****", т.к. одинарные кавычки отменили подстановку.
В командах присвоения при подстановке пробелы повторно не интерпретируются, поэтому переменные $first и $second в следующем примере имеют одно и то же значение:

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

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

a='This is a string'echo "${a}ent test of variables."

В данном случае команда echo напечатает:

This is a stringent test of variables.

Если бы вы не использовали фигурные скобки, то Shell
подставил бы пустое значение вместо "$aent" и напечатал:

test of variables.

Интерпретатором Shell поддерживаются следующие переменные. Некоторые из них определяются и устанавливаются самим интерпретатором, но все они могут быть изменены пользователем.

HOME Программа login присваивает этой переменной значение каталога загрузки пользователя, т.е. каталога, который является текущим во время выполнения login; команда cd, казанная без аргументов, переключает в каталог с именем $HOME. Использование этой переменной позволяет не следить за полными именами процедур Shell.
IFS Эта переменная определяет, какие символы являются внутренними разделителями полей. Это символы, которые Shell использует при интерпретации пробелов. (Если вы хотите использовать какой-либо разделитель, вы должны установить его в переменной IFS.) Интерпретатор Shell при запуске включает в IFS символ пробела, знак табуляции и символ новой строки.
MAIL Эта переменная содержит полное имя (с путями, где он расположен) файла, куда приходит почта. Если переменная MAIL установлена, то Shell проверяет, было ли что-нибудь добавлено в указанный файл и дает сообщение о появлении новой почты при каждом возврате на командный уровень (например, при выходе из редактора). Переменная MAIL автоматически не устанавливается; если требуется, ее необходимо установить в пользовательском файле.profile. Команда export и файл.profile рассматриваются ниже.) (О наличии почты в стандартном файле почты сообщается при загрузке независимо от значения переменной MAIL.)
MAILCHECK Этот параметр определяет с какой частотой (в секундах) Shell будет проверять появление почты в файлах, указанных в параметрах MAILPATH и MAIL. Принимаемое по умолчанию значение равно 600 секунд. Если этот параметр установлен равным 0, то Shell будет проверять наличие почты при каждом появлении символа приглашения.
MAILPATH Этот параметр содержит список имен файлов, разделенных двоеточием. Если этот параметр установлен, то Shell информирует пользователя о приходе почты в любой из указанных файлов. После каждого имени файла может стоять знак % и сообщение, которое будет выводиться, когда произойдет изменение времени модификации этого файла. По умолчанию выдается сообщение "You have mail".
SHACCT Если в этот параметр занесено имя файла, доступного пользователю для записи, Shell будет делать в него соответствующие записи для каждой выполняемой процедуры Shell. Для анализа этих данных могут использоваться такие процедуры, как acctcom (ADM) и accton (ADM).
SHELL Когда вызывается интерпретатор Shell, он ищет эту переменную и если она имеется и в ее значении вместо имени файла указан символ 'r', то Shell загружается в укороченном виде.
PATH Эта переменная определяет пути, которые использует Shell при поиске команд. Ее значение представляет собой список имен каталогов, разделенный двоеточиями. Shell присваивает переменной PATH значение:/bin:/usr/bin, где перед первым двоеточием ничего не указано. Пустой аргумент в любом месте в списке путей всегда обозначает текущий каталог. В некоторых системах поиск в текущем каталоге по умолчанию отсутствует, и поэтому переменная PATH определяется как /bin:/usr/bin. Если вы хотите, чтобы текущий каталог при поиске команд просматривался последним, а не первым, используйте:

PATH=/bin:/usr/bin:

В следующем примере два двоеточия, стоящие подряд, интерпретируются как двоеточие, за которым следует пустой аргумент и двоеточие, тем самым обозначая текущий каталог. Вы можете создать личный каталог с командами (например, $HOME/bin[color]) и задать просмотр его в первую очередь:

PATH=$HOME/bin::/bin:/usr/bin

Параметр PATH обычно устанавливается в файле [color=gray].profile.
CDPATH Эта переменная определяет пути поиска каталогов, содержащих arg. Альтернативные имена каталогов разделяются двоеточиями. Путь, используемый по умолчанию, - <null> (он определяет текущий каталог). Текущий каталог определяется нулевым именем пути, который можно указывать сразу после знака равенства или между двумя двоеточиями в любом месте списка. Если arg начинается с /, тогда поиск по путям не выполняется. В противном случае просматриваются все указанные в путях каталоги.
PS1 Эта переменная определяет, какое выражение следует использовать в качестве первичного приглашения системы. Если Shell является интерактивным, то он выдает приглашение в виде PS1, когда ожидается ввод. По умолчанию PS1 присвоено значение "$ ".
PS2 Эта переменная определяет выражение для вторичного приглашения системы. Если интерпретатору Shell требуется входных данных больше, чем было указано в строке, то он выдает приглашение в виде PS2. По умолчанию PS2 присвоено значение "> " (знак "больше", за которым следует пробел).
В большинстве случаев вам необходимо передавать все указанные переменные во все интерпретаторы, которые вы используете. Для этого используйте команду export в вашем файле.profile, например:

export HOME IFS MAIL PATH PS1 PS2

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

У некоторых переменных есть специальное значение и оно устанавливается только самим интерпретатором. Это:
$# Записывает количество аргументов, переданных в Shell, несчитая имени самой вызываемой процедуры. Например, при выполнении команды:

sh cmd a b c

в $# передается номер последнего позиционного параметра и поэтому $# равно 3. Эту переменную можно использовать, например, для проверки наличия всех необходимых аргументов:

if test $# -lt 2then echo 'two or more args required'; exitfi

$? - Эта переменная содержит код завершения последней выполненной команды. Ее значение это десятичное число. Большинство команд UNIX дают код возврата 0 при успешном завершении. Сам Shell возвращает текущее значение $? в качестве своего кода завершения.
$$ В этой переменной хранится номер текущего процесса. Поскольку номера процессов среди всех выполняемых никогда не могут совпадать, эту переменную часто используют для образования имен временных файлов. В UNIX нет механизма автоматической генерации и удаления временных файлов. Файл существует до тех пор, пока его не сотрут специально. Пользоваться временными файлами как правило бывает неудобно - механизм программных каналов UNIX для большинства приложений намного лучше. Однако, потребность во временных файлах с уникальными именами иногда все же появляется.
Следующий пример демонстрирует рекомендуемый способ создания временных файлов. Обратите внимание на то, что каталоги /bin и /usr/tmp очищаются в случае перезагрузки системы.

# применение идентификатора текущего# процесса для формирования уникального# временного файлаtemp=/usr/tmp/$$ls > $temp# здесь стоят команды, некоторые из которых# используют временные файлыrm -f $temp# стирание в конце работы

$! Номер последнего процесса, который выполнялся в фоновом режиме. Это число, содержащее от 1 до 5 цифр.
$- Это переменная, состоящая из имен флагов, включенных в данный момент в Shell.

Состояние Shell
-------------------------------------------------------------

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: