Слова 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. Логические конструкции и ||
Существуют две простые однострочные конструкции, которые могут вам время от времени встречаться: («и») и || («или»). Конструкция устроена следующим образом:
Здесь оболочка запускает команду
Конструкции и || часто находят себе применение в проверках if, и в обоих случаях код выхода последней запущенной команды определяет то, как оболочка обработает условный оператор. В случае с конструкцией , если первая команда завершается неудачно, оболочка использует ее код выхода для инструкции if, но если первая команда завершена успешно, оболочка применяет для условного оператора код выхода второй команды. В случае с конструкцией || оболочка использует код выхода первой команды при ее успешном выполнении или код выхода второй команды, если первая завершила работу неудачно.
Например:
#!/bin/sh
if [ "$1" = hi ] || [ "$1" = bye ]; then
echo 'The first argument was "'$1'"'
fi
Если ваши условные операторы содержат команду проверки ([), как показано здесь, можно использовать символы -a и -o вместо конструкций и ||, о чем рассказано в следующем разделе.
11.5.5. Проверка условий