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 

Это простейший способ присвоения значения переменной. Существует еще несколько способов присвоения:

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>

Назад | Содержание | Вперед

Copyright © CIT