Если вы намерены использовать код выхода команды, вы
При написании кода для аварийного завершения работы сценария используйте что-нибудь типа exit 1, чтобы передать код выхода 1 родительскому процессу, который запустил этот сценарий. Можно применять разные числа для различных условий.
Следует отметить, что некоторые команды, подобные diff и grep, используют ненулевые коды выхода, чтобы сообщить о нормальных условиях. Например, команда grep возвращает значение 0, если она находит что-либо, совпадающее с шаблоном, и 1, если не находит. Для таких команд код выхода 1 не свидетельствует об ошибке; для настоящих проблем команды grep и diff применяют код выхода 2. Если вы подозреваете, что какая-либо команда использует ненулевой код выхода, чтобы сообщить об успешном завершении, прочитайте страницу руководства по этой команде. Коды выхода обычно разъясняются в разделах EXIT VALUE (Код выхода) или DIAGNOSTICS (Диагностика).
11.5. Условные операторы
В оболочке Bourne shell есть специальные конструкции для условных операторов, таких как if/then/else и case. Например, следующий простой сценарий с условным оператором if проверяет, является ли строка hi значением первого аргумента сценария:
#!/bin/sh
if [$1 = hi]; then
echo 'The first argument was "hi"'
else
echo — n 'The first argument was not "hi" — '
echo It was '"'$1'"'
fi
Слова if, then, else и fi в этом сценарии являются ключевыми словами оболочки; все остальное — команды. Такое разграничение чрезвычайно важно, так как в одной из команд, [$1 = "hi"], используется символ [, который представляет реальную команду Unix, а
Понимание кодов выхода, описанных в разделе 11.4, существенно важно, поскольку весь процесс протекает следующим образом.
1. Оболочка запускает команду, которая расположена за ключевым словом if, и получает код выхода этой команды.
2. Если код выхода равен 0, оболочка выполняет команды, которые следуют после ключевого слова then, и останавливается, когда доходит до ключевого слова else или fi.
3. Если код выхода не равен 0 и существует условие else, оболочка выполняет команды, расположенные после ключевого слова else.
4. Условный оператор заканчивается ключевым словом fi.
11.5.1. Немного о пустом списке параметров
Есть небольшая проблема в условном операторе из предыдущего примера, вызванная весьма распространенной ошибкой: переменная $1 может оказаться пустой, так как пользователь может не ввести параметр. При отсутствии параметра команда тестирования прочитает [= hi], и тогда команда [прервет исполнение, выдав ошибку. Этого можно избежать, если заключить параметр в кавычки одним из приведенных ниже способов (оба являются общепринятыми):
if ["$1" = hi]; then
if [x"$1" = x" hi"]; then
11.5.2. Использование других команд для проверки условий
Все, что следует после ключевого слова if, является командой. Следовательно, если вы желаете поместить в этой же строке ключевое слово then, необходимо применить точку с запятой (;) после команды проверки. Если вы опустите точку с запятой, оболочка передаст слово then команде проверки в качестве параметра. Если вам не нравится использование точки с запятой, можно поместить ключевое слово then в отдельной строке.
Существует множество возможностей применять другие команды вместо [. Вот пример, в котором использована команда grep:
#!/bin/sh
if grep — q daemon /etc/passwd; then
echo The daemon user is in the passwd file.
else
echo There is a big problem. daemon is not in the passwd file.
fi
11.5.3. Ключевое слово elif
Ключевое слово elif позволяет вам связать вместе условные операторы if, как показано ниже. Однако не слишком увлекайтесь использованием elif, так как конструкция case, о которой вы узнаете в подразделе 11.5.6, часто оказывается более подходящей.
#!/bin/sh
if ["$1" = "hi"]; then
echo 'The first argument was "hi"'
elif ["$2" = "bye"]; then
echo 'The second argument was "bye"'
else
echo — n 'The first argument was not "hi" and the second was not "bye" — '
echo They were '"'$1'"' and '"'$2'"'
fi
11.5.4. Логические конструкции && и ||
Существуют две простые однострочные конструкции, которые могут вам время от времени встречаться: && («и») и || («или»). Конструкция && устроена следующим образом: