Нейл Мэтью - Основы программирования в Linux
Далее приведен простой пример, возвращающий код успешного завершения, если в текущем каталоге существует файл с именем .profile.
#!/bin/sh
if [ -f .profile ]; then
exit 0
fi
exit 1
Если вы любитель острых ощущений или, как минимум, лаконичных сценариев, можете переписать сценарий в виде одной строки, используя комбинацию И-списка и ИЛИ-списка, описанных ранее:
[ -f .profile ] && exit 0 || exit 1
exportКоманда export делает переменную, называемую ее параметром, доступной в подоболочках. По умолчанию переменные, созданные в командной оболочке, не доступны в новых дочерних подоболочках, запускаемых из данной. Команда export создает из своего параметра переменную окружения, которая видна другим сценариям и программам, запускаемым из текущей программы. Говоря профессиональным языком, экспортируемые переменные формируют переменные окружения в любых дочерних процессах, порожденных командной оболочкой. Лучше всего проиллюстрировать это примером из двух сценариев: export1 и export2 (упражнение 2.14).
Упражнение 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
Если вы запустите их, то получите следующий результат.
$ ./export1
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
Вычисление выражения Описания Выражение1 | Выражение2 Выражение1, если Выражение1 не равно нулю, в противном случае Выражение2 Выражение1 & Выражение2 Нуль, если оба выражения равны нулю, в противном случае Выражение1 Выражение1 = Выражение2 Равенство Выражение1 > Выражение2 Больше чем Выражение1 >= Выражение2 Больше или равно Выражение1 < Выражение2 Меньше чем Выражение1 <= Выражение2 Меньше или равно Выражение1 != Выражение2 Неравенство Выражение1 + Выражение2 Сложение Выражение1 — Выражение2 Вычитание Выражение1 * Выражение2 Умножение Выражение1 / Выражение2 Деление нацело Выражение1 % Выражение2 Остаток от деления нацелоВ современных сценариях вместо команды expr обычно применяется более эффективная синтаксическая конструкция $((...)), которая будет описана далее в этой главе.
printfКоманда printf есть только в современных командных оболочках. Группа X/Open полагает, что ее следует применять вместо команды echo для генерации форматированного вывода, несмотря на то, что, кажется, лишь немногие следуют этому совету.
У команды следующая синтаксическая запись.
printf "строка формата" параметр1 параметр2 ...
Строка формата очень похожа с некоторыми ограничениями на применяемую в языках программирования С и С++. Главным образом не поддерживаются числа с плавающей точкой, поскольку все арифметические операции в командной оболочке выполняются над целыми числами. Строка формата состоит из произвольной комбинации литеральных символов, escape-последовательностей и спецификаторов преобразования. Все символы строки формата, отличающиеся от и %, отображаются на экране при выводе.
В табл. 2.7 приведены поддерживаемые командой escape-последовательности.
Таблица 2.7
Escape-последовательность Описание " Двойная кавычка \ Символ обратный слэш a Звуковой сигнал тревоги (звонок колокольчика или прерывистый звуковой сигнал) b Символ Backspace (стирание слева) c Отбрасывание последующего вывода f Символ Form feed (подача бумаги) n Символ перехода на новую строку r Возврат каретки t Символ табуляции v Символ вертикальной табуляции ooo Один символ с восьмеричным значением ooo xHH Один символ с шестнадцатеричным значением HHСпецификаторы преобразований довольно сложны, поэтому мы приведем наиболее распространенные варианты их применения. Более подробную информацию можно найти в интерактивном справочном руководстве командной оболочки bash или на страницах раздела 1 интерактивного руководства к команде printf (man 1 printf). (Если вы не найдете нужных сведений в разделе 1, попробуйте поискать в разделе 3.) Спецификатор преобразования состоит из символа %, за которым следует символ преобразования. Основные варианты преобразований перечислены в табл. 2.8.
Таблица 2.8
Символ преобразования Описание D Вывод десятичного числа С Вывод символа S Вывод строки % Вывод знака %Строка формата используется для интерпретации остальных параметров команды и вывода результата, как показано в следующем примере:
$ printf "%sn" hello
hello
$ printf "%s %dt%s" "Hi There" 15 people
Hi There 15 people
Обратите внимание на то, что для защиты строки Hi There и превращения ее в единый параметр, строку нужно заключить в кавычки ("").