Выбрать главу

dollar=99

great_picture=die hard

last_file=ZLPSO.txt

Вывод команды set может быть довольно обширен; при его изучении можно заметить, что интерпретатор shell значительно облегчил работу в среде.

14.2.4. Объединение значений переменных

Чтобы объединить значения переменных, достаточно последовательно расположить переменные:

echo ${имя_переменной}${имя_переменной}. . ,

$ FIRST="Bruce "

$ SURNAME=Willis

$ echo ${FIRST}${SURNAME}

Bruce Willis

14.2.5. Проверка на наличие значения переменной (подстановка)

Допустим, что нужно проверить, была ли установлена либо инициализирована переменная. Если это не так, можно тут же воспользоваться другим значением. Формат используемой в этом случае команды будет следующий:

${переменная: — значение}

Если переменная установлена, она применяется. Если переменная не установлена, вместо нее используется значение, например:

$ COLOUR=blue

$ echo "The sky is ${COLOUR:=grey} today"

The sky is blue today

Переменная colour имеет значение blue. Когда команда echo выводит на экран значение переменной colour, выполняется проверка, была ли установлена переменная ранее. Если переменная установлена, используется это значение. Выполним сброс значения переменной и рассмотрим результат.

$ COLOUR=blue

$ unset COLOUR

$ echo "The sky is ${COLOUR:=grey} today"

The sky is grey today

В приведенном примере переменной не присваивается действительное значение; для присваивания значения следует применить формат:

${переменная:=значение}

Рассмотрим более полезный пример, в котором содержится запрос о времени создания платежной ведомости (payroll), а также относительно ее типа. Если в обоих случаях при указании времени и типа нажать клавишу [Enter], то значения этих переменных не будут установлены пользователем. В этом случае применяются новые значения, заданные по умолчанию (03:00 и Weekly). Затем значения передаются команде at, что свидетельствует о переносе выполнения задания на более поздний срок.

$ pg vartest

#!/bin/sh

# vartest

echo "what time do you wish to start the payroll [03:00]:"

read TIME

echo " process to start at ${TIME:=03:00} OK"

echo "Is it a monthly or weekly run [Weekly]:"

read RUN_TYPE

echo "Run type ls ${RUN_TYPE:=Keekly}"

at -f $RUN_TYPE $TIME

Ниже при выводе данных выбирается клавиша [Enter] в обоих случаях.

$ vartest

what time do you wish to start the payroll [03:00]:

process to start at 03:00 OK ls it a monthly or weekly run [Weekly]:

Run type is Weekly

warning: commands will be executed using /bin/sh job 15 at 1999-05-14 03:00

Можно также проверить, установлено ли значение переменной, и затем выйти из системы, получив сообщение об ошибке. В следующем примере проверяется, установлен ли параметр для файла переменной длины.

$ echo "The file is ${FILES:?}"

sh: files: parameter null or not set

Приведенное выше сообщение не слишком информативно, но пользователь может задать свое собственное сообщение.

$ echo "The file is $(FILES:?} sorry cannot locate the variable files")"

sh: files: sorry cannot locate the variable files

Чтобы проверить, содержит ли переменная значение (а если не содержит, возвратить пустую строку), примените следующую команду:

${переменная:+значение)

Для инициализации переменной значением пустой строки примените команду:

variable=""

$ DESTINATION=""

14.2.6. Применение переменных, содержащих аргументы системных команд

Переменные можно также использовать для хранения информации, применяемой впоследствии для замены аргументов в командах системы. В следующем примере переменные сохраняют информацию об имени файла, которая необходима для копирования файла. С помощью переменной SOURCE можно узнать путь к файлу passwd, а с помощью переменной DEST — получателя этого файла. Обе эти переменные применяются в команде ср.

$ SOURCE="/etc/passwd"

$ DEST="/tmp/passwd.bak"

$ cp ${SOURCE} ${DEST}

В примере ниже с помощью переменной device получаем путь к накопителю на магнитной ленте. Эти сведения используются затем в команде mt при перемотке ленты.

$ DEVICE="/dev/rmt/0n"

$ mt -f ${DEVICE} rewind

14.2.7. Как сделать переменную доступной только для чтения

Если переменной присваивается значение, то может потребоваться, чтобы это значение не изменялось. Для этого достаточно сделать переменную доступной только для чтения. Если пользователь попытается изменить значение, появится сообщение об ошибке, в котором указывается, что данная переменная предназначена только для чтения. В этом случае применяется следующий формат:

имя_переменной=значение readonly имя_переменной