Примечание
Вас могли заинтересовать непонятные биты set-group-id и set-user-id (также называемые set-gid и set-uid). Бит set-uid предоставляет программе права владельца, а не просто ее пользователя, бит set-gid предоставляет программе права группы. Эти биты устанавливаются командой
chmod
с помощью опций
s
и
g
. На файлы, содержащие сценарии, флаги set-gid и set-uid не влияют, они оказывают влияние только на исполняемые двоичные файлы.
Мы немного сами себя обогнали, но далее следует пример тестирования состояния файла /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
очень прост: он проверяет результат выполнения команды и затем в зависимости от
условия
выполняет ту или иную группу операторов.
<b>if</b> <i>условие</i>
<b>then</b>
<i> операторы</i>
<b>else</b>
<i> операторы</i>
<b>fi</b>
Наиболее часто оператор
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
<b>yes</b>
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"
<i>elif [ $timeofday = "no" ]; then</i>
<i> echo "Good afternoon"</i>
<i>else</i>
<i> echo "Sorry, $timeofday not recognized. Enter yes or no "</i>
<i> exit 1</i>
fi
exit 0
Как это работает
Этот пример очень похож на предыдущий, но теперь, если первое условие не равно
true
, оператор командной оболочки
elif
проверяет переменную снова. Если обе проверки не удачны, выводится сообщение об ошибке, и сценарий завершается со значением 1, которое в вызывающей программе можно использовать для проверки успешного выполнения сценария.