9.2. Переменные
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>
Назад | Содержание | Вперед