shell программы манипулируют с
переменными. В этом пункте
обсуждаются три типа переменных:
- позиционные параметры;
- специальные параметры;
- именованные переменные.
9.2.1. Позиционные параметры
Позиционные параметры являются
переменными в shell программе. Их
значение устанавливается из
аргументов, указанных в командной
строке, которая вызывает программу.
Позиционные параметры нумеруются и
на них ссылка идет с помощью
символа $: $1, $2, $3 и т.д.
shell программа может использовать
до 9 позиционных параметров. Если
shell программа вызывается с помощью
командной строки, подобной
следующей:
shell.prog pp1 pp2 pp3 pp4 pp5 pp6 pp7 pp8 pp9 <CR>
то позиционному параметру $1 в
программе присваивается значение
pp1, $2 - значение pp2 и т.д. во время
вызова программы. Чтобы
практически рассмотреть это
замещение позиционных параметров,
создайте файл pp. Затем введите
команды echo в файл pp. В результате
выполнения команды cat получим
следующий вывод:
$ cat pp<CR>
echo The first positional parameter is: $1<CR>
echo The second positional parameter is: $2<CR>
echo The third positional parameter is: $3<CR>
echo The fourth positional parameter is: $4<CR>
$
Если вы выполните эту shell
программу с аргументами one, two, three,
four, то получите результат (но
вначале нужно сделать shell программу
pp исполняемой с помощью команды
chmod):
$ chmod u+x pp<CR>
$
$ pp one two three four<CR>
echo The first positional parameter is: one
echo The second positional parameter is: two
echo The third positional parameter is: three
echo The fourth positional parameter is: four
$
Команда who перечисляет всех
пользователей, в данный момент
зарегистрированных в системе.
Можем создать простую программу
whoson, которая будет сообщать,
работает ли в настоящий момент
конкретный пользователь. Введем в
файл whoson командную строку:
who | grep $1<CR>
Команда who перечисляет всех
текущих пользователей системы, а
команда grep осуществляет поиск
строки, содержащей значение,
соответствующее позиционному
параметру $1. Теперь подставим
конкретное имя в качестве
аргумента в файле whoson, например, sue.
Когда вы зададите команду "whoson
sue", shell программа заменит $1 на sue в
вашей программе и выполнит ее в
следующем виде:
who | grep sue<CR>
Вывод будет следующим:
$ whoson sue<CR>
sue tty26 Jan 24 13:35
$
Если указанный пользователь sue не
зарегистрирован в данный момент в
системе, grep завершится неудачно и
whoson не будет ничего выводить на
экран.
shell позволяет указывать в
командной строке до 128 аргументов,
но ссылаться можно не более, чем на 9
позиционных параметров. В
следующем пункте описан
специальный параметр $*.
9.2.2. Специальные параметры
Когда вы обращаетесь к программе
shell, специальный параметр $#
содержит число аргументов, с
которыми shell программа была
вызвана. Это значение может
использоваться в любом месте shell
программы.
Например, создайте командную
строку в файле get.num, сделайте файл
исполняемым и запустите команду cat:
$ cat get.num<CR>
echo The number of arguments is: $#
$
Программа просто отобразит число
аргументов, с которыми она была
вызвана.
Когда вы обращаететсь к shell
программе специальный параметр $*
содержит строку со всеми
аргументами, с которыми программа
была вызвана.
9.2.3. Именованные переменные
В shell программе вы можете
использовать именованные
переменные. Значение именованной
переменной вы присваиваете сами
следующим образом:
name_variable=value<CR>
Обратите внимание, что ни слева ни
справа от знака равенства нет
пробелов.
В следующем примере var1 - это имя
переменной, а myname - значение строки
символов, которое присваивается
переменной:
Пример.
var1=myname<CR>
Знак $ используется перед именем
переменной в shell программе для
ссылки на значение этой переменной.
Если взять предыдущий пример, то
ссылка $var1 говорит shell, что нужно
заменить на значение myname любую
встретившуюся строку символов $var1.
Первый символ имени переменной
должен быть буквой или символом
подчеркивания. Имя переменной
может состоять из букв, символов
подчеркивания и цифр. Имена
переменных не должны совпадать с
именами shell команд. Также shell
зарезервировано несколько имен
переменных, которые вы не должны
использовать для своих переменных.
Ниже дано краткое описание этих
зарезервированных имен переменных:
CDPATH - определяет путь поиска
команды;
HOME - значение, используемое по
умолчанию командой cd (собственный
справочник);
IFS - определяет разделитель (обычно
пробел, табуляция и возврат
каретки);
LOGNAME - ваше регистрационное имя;
MAIL - имена файлов, которые содержат
электронную почту;
PATH - определяет имя пути,
используемое shell для нахождения
команд;
PS1 - определяет первичную подсказку
(по умолчанию $);
PS2 - определяет вторичную подсказку
(по умолчанию >);
TERM - идентифицирует тип терминала.
Значение этой переменной важно при
работе с редактором vi;
TERMINFO - идентифицирует справочник, в
котором находится информация о
вашем терминале;
TZ - определяет зону времени (по
умолчанию EST5EDT).
Значение этих переменных вы
можете определить двумя способами.
Первый, вы можете ввести:
echo $variable_name
Система распечатает значение
переменной variable_name. Второй способ:
вы можете воспользоваться командой
env для распечатки значений всех
определенных переменных в shell. Для
этого введите команду env и система
выдаст список всех имен переменных
и их значения.
9.2.4. Присвоение значений
переменным
Если вы редактируете с помощью
редактора vi, то знаете, что можно
установить значения переменной TERM
вводом следующей командной строки:
TERM=terminal_name<CR>
export TERM
Это простейший способ присвоения
значения переменной. Существует
еще несколько способов присвоения:
- использование команды read для
присвоения ввода переменной;
- перенаправление вывода
команды в переменную с
использованием команды замены
со знаками слабого ударения
(`...`);
- присвоение позиционного
параметра переменной.
9.2.4.1. Использование команды read
Общий формат команды read:
read variable<CR>
Значение, присвоенное командой read
переменной variable, будет заменять
$variable где бы она не встречалась в
программе пользователя. Если
программа выполняет команду echo до
команды read, то она сможет
отобразить только:
Type in ...
Команда read будет ждать до тех пор,
пока вы не введете строку символов
и нажмете клавишу <CR>, тем самым
присваивая строку переменной.
Следующий пример покажет вам, как
написать простую shell программу
num.please, содержащую телефонные
номера. Эта программа использует
следующие команды:
echo - выдает подсказку для ввода
фамилий клиентов;
read - присваивает вводимое значение
переменной;
grep - просматривает файл list в поисках
этой переменной.
Программа будет выглядеть
следующим образом:
Пример.
$ cat num.please<CR>
echo Type in the list name:
read name
grep $name home/list
$
Создайте файл list, содержащий
несколько фамилий и номеров
телефонов. И теперь запустите файл
num.please.
В следующем примере приводится
текст программы mknum, которая
создает список. В программе mknum
используется следующая
последовательность команд:
echo - выдает подсказку для ввода
имени клиента;
read - присваивает имя клиента
переменной name;
echo - выдает подсказку для ввода
номера телефона;
read - присваивает номер телефона
переменной num;
echo - добавляет значение переменных
name и num в файл list;
Если вы хотите, чтобы вывод
команды echo добавлялся в конец
списка, то вы должны использовать
>>. Если вы будете использовать
>, то список будет состоять из
последего номера телефона, который
вы добавили.
С помощью команды cat отобразите
содержание программы mknum:
Пример.
$ cat mknum<CR>
echo Type in name
read name
echo Type in number
read num
echo $name $num >> list
$ chmod u+x mknum<CR>
$
9.2.4.2. Перенаправление вывода
команды в переменную
Формат команды следующий:
variable=command<CR>
Вывод команды становится
значением переменной. Пример shell
программы t, распечатывающей время:
$ cat t<CR>
time=`date | cut -c12-19`
echo The time is: $time
$
Сделайте файл исполняемым и
получите программу, которая выдает
время:
$ chmod u+x t<CR>
$ t<CR>
The time is: 10:30
$
9.2.4.3. Присвоение позиционного
параметра переменной
Вы можете присвоить позиционный
параметр именованному параметру
следующим образом:
var1=$1<CR>
В следующем примере приведена
программа simp.p, которая присваивает
позиционнный параметр переменной:
Пример.
$ cat simp.p<CR>
var1=$1
echo $var1
$
Также вы можете присвоить
переменной вывод команды, которая
использует позиционные параметры:
person=`who | grep $1`<CR>
|