Основы программирования в Linux
Упражнение 2.14. Экспорт переменных1. Первым представим сценарий export2.
#!/bin/shecho "$foo"echo "$bar"2. Теперь сценарий export1. В конце сценария запускается export2.
#!/bin/shfoo="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 -allexportexprКоманда
вычисляет выражение, составленное из ее аргументов. Чаще всего она применяется для подсчета простых арифметических выражений в следующем виде: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Команда
есть только в современных командных оболочках. Группа X/Open полагает, что ее следует применять вместо командыprintfдля генерации форматированного вывода, несмотря на то, что, кажется, лишь немногие следуют этому совету.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