Упражнение 2.14. Экспорт переменных
1. Первым представим сценарий export2.
#!/bin/sh
echo "$foo"
echo "$bar"
2. Теперь сценарий export1. В конце сценария запускается export2.
#!/bin/sh
foo="The first meta-syntactic variable"
export bar="The second meta-syntactic variable"
export2
Если вы запустите их, то получите следующий результат.
$ <b>./export1</b>
The second meta-syntactic variable
$
Как это работает
Сценарий export2 просто выводит значения двух переменных. В сценарии export1 задаются значения обеих переменных, но только переменная bar помечается как экспортируемая, поэтому, когда впоследствии запускается сценарий export2, значение переменной
foo
потеряно, а значение переменной
bar
экспортировано во второй сценарий. На экране появляется пустая строка, поскольку
$foo
ничего не содержит и вывод переменной со значением
null
приводит к отображению новой строки.
После того как переменная была экспортирована из командной оболочки, она экспортируется в любые сценарии, запускаемые из этой оболочки, и в любые командные оболочки, которые в свою очередь запускают эти сценарии, и т.д. Если бы сценарий export2 вызвал другой сценарий, в нем переменная
bar
также была бы доступна.
Примечание
Команды
set -а
или
set -allexport
экспортируют все переменные соответственно.
expr
Команда
expr
вычисляет выражение, составленное из ее аргументов. Чаще всего она применяется для подсчета простых арифметических выражений в следующем виде:
х=`expr $x + 1`
Символы
``
(обратная кавычка или обратный апостроф) заставляют переменную
х
принять результат выполнения команды
expr $х + 1
. Ее можно также записать с помощью синтаксической конструкции
$( )
вместо обратной кавычки, например, следующим образом:
х=$(expr $х + 1)
Команда expr обладает большими возможностями, с ее помощью можно вычислять различные выражения. Основные виды вычислений перечислены в табл. 2.6.
Таблица 2.6
Вычисление выражения | Описания |
<i>Выражение1 | Выражение2</i>
| <i>Выражение1</i> , если Выражение1 не равно нулю, в противном случае Выражение2
|
<i>Выражение1</i> & <i>Выражение2</i>
| Нуль, если оба выражения равны нулю, в противном случае Выражение1
|
<i>Выражение1</i> = <i>Выражение2</i>
| Равенство |
<i>Выражение1</i> > <i>Выражение2</i>
| Больше чем |
<i>Выражение1</i> >= <i>Выражение2</i>
| Больше или равно |
<i>Выражение1</i> < <i>Выражение2</i>
| Меньше чем |
<i>Выражение1</i> <= <i>Выражение2</i>
| Меньше или равно |
<i>Выражение1</i> != <i>Выражение2</i>
| Неравенство |
<i>Выражение1</i> + <i>Выражение2</i>
| Сложение |
<i>Выражение1</i> — <i>Выражение2</i>
| Вычитание |
<i>Выражение1</i> * <i>Выражение2</i>
| Умножение |
<i>Выражение1</i> / <i>Выражение2</i>
| Деление нацело |
<i>Выражение1</i> % <i>Выражение2</i>
| Остаток от деления нацело |
В современных сценариях вместо команды
expr
обычно применяется более эффективная синтаксическая конструкция
$((...))
, которая будет описана далее в этой главе.
printf
Команда
printf
есть только в современных командных оболочках. Группа X/Open полагает, что ее следует применять вместо команды
echo
для генерации форматированного вывода, несмотря на то, что, кажется, лишь немногие следуют этому совету.
У команды следующая синтаксическая запись.
<b>printf</b><i> "строка формата" параметр1 параметр2 ...</i>
Строка формата очень похожа с некоторыми ограничениями на применяемую в языках программирования С и С++. Главным образом не поддерживаются числа с плавающей точкой, поскольку все арифметические операции в командной оболочке выполняются над целыми числами. Строка формата состоит из произвольной комбинации литеральных символов, escape-последовательностей и спецификаторов преобразования. Все символы строки формата, отличающиеся от
\
и
%
, отображаются на экране при выводе.
В табл. 2.7 приведены поддерживаемые командой escape-последовательности.
Таблица 2.7
Escape-последовательность | Описание |
\"
| Двойная кавычка |
\\
| Символ обратный слэш |
\a
| Звуковой сигнал тревоги (звонок колокольчика или прерывистый звуковой сигнал) |
\b
| Символ Backspace (стирание слева) |
\c
| Отбрасывание последующего вывода |
\f
| Символ Form feed (подача бумаги) |
\n
| Символ перехода на новую строку |
\r
| Возврат каретки |
\t
| Символ табуляции |
\v
| Символ вертикальной табуляции |
\ooo
| Один символ с восьмеричным значением ooo
|
\xHH
| Один символ с шестнадцатеричным значением HH
|