Мы немного сами себя обогнали, но далее следует пример тестирования состояния файла /bin/bash, так что вы сможете увидеть, как это выглядит на практике.
#!/bin/sh
if [ -f /bin/bash ]
then
echo "file /bin/bash exists"
fi
if [ -d /bin/bash ]
then
echo "/bin/bash is a directory"
else
echo "/bin/bash is NOT a directory"
fi
Для того чтобы тест мог оказаться истинным, предварительно, для проверки всех файловых флагов требуется наличие файла. Данный перечень включает только самые широко используемые опции команды test
, полный список можно найти в интерактивном справочном руководстве. Если вы применяете оболочку bash, в которую встроена команда test
, используйте команду help test
для получения дополнительных сведений. Позже в этой главе мы применим некоторые из этих опций.
Теперь, когда вы познакомились с условиями, можно рассмотреть управляющие структуры, использующие эти условия.
В командной оболочке есть ряд управляющих структур или конструкций, похожих на аналогичные структуры в других языках программирования.
Примечание
В следующих разделах элемент синтаксической записи операторы — это последовательности команд, которые выполняются, когда или пока условие удовлетворяется или пока оно не удовлетворяется.
if
Управляющий оператор if
очень прост: он проверяет результат выполнения команды и затем в зависимости от условия
выполняет ту или иную группу операторов.
if условие
then
операторы
else
операторы
fi
Наиболее часто оператор if
применяется, когда задается вопрос, и решение принимается в зависимости от ответа:
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
if [ $timeofday = "yes" ]; then
echo "Good morning"
else
echo "Good afternoon"
fi
exit 0
В результате будет получен следующий вывод на экран:
Is it morning? Please answer yes or no
yes
Good morning
$
В этом сценарии для проверки содержимого переменной timeofday
применяется команда [
. Результат оценивается оператором командной оболочки if
, который затем разрешает выполнять разные строки программного кода.
Примечание
Обратите внимание на дополнительные пробелы, используемые для формирования отступа внутри оператора if
. Это делается только для удобства читателя; командная оболочка игнорирует дополнительные пробелы.
elif
К сожалению, с этим простым сценарием связано несколько проблем. Во-первых, он принимает в значении no
(нет) любой ответ за исключением yes
(да). Можно помешать этому, воспользовавшись конструкцией elif
, которая позволяет добавить второе условие, проверяемое при выполнении части else
оператора if
(упражнение 2.3).
Упражнение 2.3. Выполнение проверок с помощью elif
Вы можете откорректировать предыдущий сценарий так, чтобы он выводил сообщение об ошибке, если пользователь вводит что-либо отличное от yes
или no
. Для этого замените ветку else
веткой elif
и добавьте еще одно условие:
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
if [ $timeofday = "yes" ]
then
echo "Good morning"
elif [ $timeofday = "no" ]; then
echo "Good afternoon"
else
echo "Sorry, $timeofday not recognized. Enter yes or no "
exit 1
fi
exit 0
Как это работает
Этот пример очень похож на предыдущий, но теперь, если первое условие не равно true
, оператор командной оболочки elif
проверяет переменную снова. Если обе проверки не удачны, выводится сообщение об ошибке, и сценарий завершается со значением 1, которое в вызывающей программе можно использовать для проверки успешного выполнения сценария.
Проблема, связанная с переменными
Данный сценарий исправляет наиболее очевидный дефект, а более тонкая проблема остается незамеченной. Запустите новый вариант сценария, но вместо ответа на вопрос просто нажмите клавишу (или на некоторых клавиатурах клавишу ). Вы получите сообщение об ошибке:
[: =: unary operator expected
Что же не так? Проблема в первой ветви оператора if
. Когда проверялась переменная timeofday
, она состояла из пустой строки. Следовательно, ветвь оператора if
выглядела следующим образом:
Читать дальше