|
| ||||||||||||
| ||||||||||||
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 зарезервировано несколько имен переменных, которые вы не должны использовать для своих переменных. Ниже дано краткое описание этих зарезервированных имен переменных:
Значение этих переменных вы можете определить двумя способами. Первый, вы можете ввести: 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, содержащую телефонные номера. Эта программа использует следующие команды:
Программа будет выглядеть следующим образом: Пример.
$ cat num.please<CR>
echo Type in the list name:
read name
grep $name home/list
$
Создайте файл list, содержащий несколько фамилий и номеров телефонов. И теперь запустите файл num.please. В следующем примере приводится текст программы mknum, которая создает список. В программе mknum используется следующая последовательность команд:
Если вы хотите, чтобы вывод команды 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> Назад | Содержание | Вперед |
|
CITForum © 1997–2025