Управляющие структуры

В командной оболочке есть ряд управляющих структур или конструкций, похожих на аналогичные структуры в других языках программирования.

В следующих разделах элемент синтаксической записи операторы— это последовательности команд, которые выполняются, когда или пока условие удовлетворяется или пока оно не удовлетворяется.

Оператор разветвления if

Оператор if очень прост: он проверяет результат выполнения команды и затем в зависимости от условия выполняет ту или иную группу операторов.

if условие then

операторы

else

операторы

fi

Наиболее часто оператор if применяется, когда задается вопрос, и решение принимается в зависимости от ответа.

Пример 3

#!/bin/sh

echo "Сейчас утро? Ответьте yes или no"

read timeofday

if [ $timeofday = "yes" ]; then

echo "Доброе утро"

else

echo "Добрый вечер"

fi

exit 0

В результате будет получен следующий вывод на экран:

Сейчас утро? Ответьте yes или no yes

yes

Доброе утро

$

В этом сценарии для проверки содержимого переменной timeofday применяется команда [. Результат оценивается оператором if, который затем разрешает выполнять разные строки программного кода.

Дополнительные пробелы, используемые для формирования отступа внутри оператора if нужны только для удобства читателя; командная оболочка их игнорирует.

Конструкция elif

К сожалению, с этим простым сценарием связано несколько проблем. Во-первых, он принимает в значении nо (нет) любой ответ за исключением yes (да). Можно усовершенствовать сценарий, воспользовавшись конструкцией elif, которая позволяет добавить второе условие, проверяемое при выполнении части else оператора if (пример 4).

Можно откорректировать предыдущий сценарий так, чтобы он выводил сообщение об ошибке, если пользователь вводит что-либо отличное от yes или nо. Для этого следует заменить ветку else веткой elif и добавить еще одно условие:

Пример 4

#!/bin/sh

echo "Сейчас утро? Ответьте yes или no"

read timeofday

if [ $timeofday = "yes" ]

then

echo "Доброе утро"

elif [ $timeofday = "no" ]; then

echo "Добрый вечер "

else

echo "Извините, $timeofday не распознается. Ответьте yes или no "

exit 1

fi

exit 0

Пример 4 очень похож на предыдущий, но теперь, если первое условие не равно true, оператор командной оболочки elif проверяет переменную снова. Если обе проверки не удачны, выводится сообщение об ошибке, и сценарий завершается со значением 1, которое в вызывающей программе можно использовать для проверки успешного выполнения сценария.

Проблема, связанная со значением переменной

Данный сценарий исправляет наиболее очевидный дефект, а более тонкая проблема остается незамеченной. Запустите новый вариант сценария, но вместо ответа на вопрос просто нажмите клавишу <Enter>. Вы получите сообщение об ошибке:

[: =: unary operator expected

Что же не так? Проблема в первой ветви оператора if. Когда проверялась переменная timeofday, она состояла из пустой строки. Следовательно, ветвь оператора if выглядела следующим образом: if [ = "yes" ] и не представляла собой верное условие. Во избежание этого следует заключить имя переменной в кавычки: if [ "$timeofday" = "yes" ]

Теперь проверка с пустой переменной будет корректной:

if [ "" = "yes" ]

Новый сценарий будет таким:

Пример 5.

#!/bin/sh

echo " Сейчас утро? Ответьте yes или no "

read timeofday

if [ "$timeofday " = "yes" ]

then

echo "Доброе утро"

elif [ "$timeofday" = "no" ]; then

echo "Добрый вечер "

else

echo "Извините, $timeofday не распознается. Ответьте yes или no "

exit 1

fi

exit 0

Этот вариант безопасен, даже если пользователь в ответ на вопрос просто нажмет клавишу <Enter>.

Примечание. Если вы хотите, чтобы команда echo не переходила на новую строку, наиболее переносимый вариант— применить команду printf (см. раздел "printf" далее) вместо команды echo. В оболочке bash для запрета перехода на новую строку допускается команда echo –n. Поэтому можно написать:

echo -n " Сейчас утро? Ответьте yes или no: "

Нужно оставлять дополнительный пробел перед закрывающими кавычками для формирования зазора перед вводимым пользователем ответом.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: