Рассматриваемый листинг включает два небольших сценария под именами father и child. Сценарий father задает переменную с именем film, значение которой "A Few Good Men". Эта переменная отображается на экране, затем вызывается другой сценарий под названием child. Данный сценарий отображает переменную film из первого сценария. Перед отображением на экране значением переменной film становится "Die Hard". Затем управление передается назад, сценарию father, и значение переменной снова выводится на экран.
$ pg father
#!/bin/sh
# сценарий father.
echo "this ls the father"
FILM="A Few Good Men"
echo "I like the film: $FILM"
# вызов сценария child
child
echo "back to father"
echo "and the film ls :$FILM"
$ pg child
#!/bin/sh
# сценарий child
echo "called from father..! am the child"
echo "film name is :$FILM"
FILM="Die Hard"
echo "changing film to :$FILM"
Рассмотрим, что будет отображаться на экране в результате выполнения сценария.
$ father
this ls the father
I like the film :A Few Good Men
called from father… i am the child
film name is :
changing film to :Die Hard
back to father
and the film ls :A Few Good Men
Сценарий child не может возвратить переменную film, поскольку эта переменная не может быть экспортирована в сценарий father.
Теперь, если команду export добавить в сценарий father, сценарий child получит всю информацию о переменной film.
$ pg father
#!/bin/sh
# сценарий father.
echo "this ls the father"
FILM="A Few Good Men"
echo "I like the film :$FILM"
#вызов сценария child
#сначала экспортируйте переменную
export FILM
child
echo "back to father"
echo "and the film is :$FILM"
$ father2
this ls the father
I like the film :A Few Good Men
called from father… i am the child
film name ls :A Few Good Men
changing film to :Die Hard
back to father
and the film ls :A Few Good Men
После того как команда export включена в состав сценария, можно выполнить произвольное число процессов. И всем этим процессам известно о наличии переменной FILM.
Нельзя выполнять экспорт переменных из дочерних процессов в родительский процесс; однако с помощью изменения направления этого можно добиться.
14.4. Позиционные параметры командной строки
Как указывалось в начале главы, существуют переменные четырех типов. Имеются переменные интерпретатора команд, переменные среды, а также переменные двух других типов, которые являются специальными, поскольку они предназначены только для чтения. Существуют позиционные и специальные параметры. Рассмотрим позиционные параметры.
Если информация передается shell–сценарию, с помощью позиционных параметров можно получить доступ к ней. Каждый параметр передает сценарию заданное количество ссылок. Можно передавать произвольное число аргументов, но доступными являются только первые девять из них. Это ограничение преодолевается путем использования команды shift. Далее в книге будет показано, как работает команда shift. Нумерация параметров начинается с единицы и завершается девятью; каждый параметр, доступ к которому следует получить, предваряется знаком доллара $. Первый параметр, имеющий номер нуль, резервируется для представления действительного названия сценария; это значение может использоваться независимо от того, содержатся ли в сценарии параметры.
В приведенной таблице в качестве примера демонстрируется, как можно получить доступ к каждому параметру, если в сценарий передается строка "Did You See The Full Moon"
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
Наименование сценария
Did
You
See
The
Full
Moon
14.4.1. Применение в сценариях позиционных параметров
Воспользуемся приведенным выше примером в следующем сценарии.
$ pg param
#!/bin/sh # параметры
echo "This ls the script name : $0"
echo "This ls the first parameter : $1"
echo "This ls the second parameter : $2"
echo "This ls the third parameter : $3"
echo "This ls the fourth parameter : $4"
echo "This ls the fifth parameter : $5"
echo "This ls the sixth parameter : S6"
echo "This ls the seventh parameter : $7"
echo "This ls the eighth parameter : $8"
echo "This ls the ninth parameter : $9"
$ param Did You See The Full Moon
This ls the script name : ./param
This ls the first parameter : Did
This ls the second parameter : You
This ls the third parameter : See
This ls the fourth parameter : The
This ls the fifth parameter : Full
This ls the sixth parameter : Moon
This ls the seventh parameter :
This ls the eighth parameter :
This ls the ninth parameter :
Если передаются шесть параметров, седьмой, восьмой и девятый будут пустыми, чего и следовало ожидать. Обратите внимание, что первый параметр содержит название сценария. Этот параметр удобно использовать, если сценарий выдает сообщение об ошибках. Ниже приводится другой пример, где получается название: сценария.
$ pg param2 .
#!/bin/sh
echo "Hello world this ls $0 calling"
$ param2
Hello world this ls ./param2 calling
Заметьте, что параметр $0 также позволяет получить путь доступа к текущему каталогу. Для получения названия сценария предварите параметр $0 командой
basename.
$ pg param2
#!/bin/sh
echo "Hello world this ls `basename $0` calling"
$ param2
Hello world this ls param2 calling
14.4.2. Передача параметров в системные команды
Параметры можно передавать внутри сценария в системную команду. В следующем примере используется команда find . Параметр $1 указывает имя искомого файла.
$ pg findfile
#!/bin/sh
# findfile
find / -name $1 -print
$ findfile passwd
/etc/passwd
/etc/uucp/passwd
/usr/bin/passwd
Ниже приводится другой пример. В виде параметра $1 файл user‑id передается команде grep; команда grep использует эти сведения для поиска файла passwd, где содержится полное имя пользователя.
$ pg who_is
#!/bin/sh
# who_is
grep $1 passwd | awk -F: {print $4}'
$ who_is seany
Seany Post
14.4.3. Специальные параметры
Теперь, когда вы изучили, как получить доступ к параметрам shell–сценариев и применять их, было бы полезным узнать об этих параметрах больше. Рассмотрим, каким образом сценарий применяет специальные параметры. Существует семь специальных параметров, которые представлены в табл. 14.2.
Таблица 14.2. Специальные параметры интерпретатора shell
$#
Число аргументов, передаваемых сценарию
$*
В отдельной строке отображаются все аргументы, которые передаются сценарию. Здесь может содержаться более девяти параметров, в отличие от позиционных параметров
$$
Текущий идентификатор PID для выполняющегося сценария
$!
Идентификатор PID для последнего процесса, который выполняется в фоновом режиме