При программировании сценариев в командной оболочке код завершения 0 — успешное завершение сценария, коды от 1 до 125 включительно — коды ошибок, которые можно использовать в сценариях. Оставшиеся значения зарезервированы в соответствии с табл. 2.5.
Таблица 2.5
| Код завершения |
Описание |
| 126 |
Файл не является исполняемым |
| 127 |
Команда не найдена |
| 128 и выше |
Появившийся сигнал |
Многим программистам на языках С и С++ использование нуля как признака успешного завершения может показаться несколько необычным. Большое преимущество сценариев — возможность применения 125 кодов ошибок, определенных пользователем, и отсутствие необходимости в глобальной переменной для хранения кода ошибки.
Далее приведен простой пример, возвращающий код успешного завершения, если в текущем каталоге существует файл с именем .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обычно применяется более эффективная синтаксическая конструкция $((...)), которая будет описана далее в этой главе.
Читать дальше