Основы программирования в Linux
ПримечаниеВас могли заинтересовать непонятные биты set-group-id и set-user-id (также называемые set-gid и set-uid). Бит set-uid предоставляет программе права владельца, а не просто ее пользователя, бит set-gid предоставляет программе права группы. Эти биты устанавливаются командой
с помощью опцийchmodиs. На файлы, содержащие сценарии, флаги set-gid и set-uid не влияют, они оказывают влияние только на исполняемые двоичные файлы.gМы немного сами себя обогнали, но далее следует пример тестирования состояния файла /bin/bash, так что вы сможете увидеть, как это выглядит на практике.
#!/bin/shif [ -f /bin/bash ]thenecho "file /bin/bash exists"fiif [ -d /bin/bash ]thenecho "/bin/bash is a directory"elseecho "/bin/bash is NOT a directory"fiДля того чтобы тест мог оказаться истинным, предварительно, для проверки всех файловых флагов требуется наличие файла. Данный перечень включает только самые широко используемые опции команды
, полный список можно найти в интерактивном справочном руководстве. Если вы применяете оболочку bash, в которую встроена командаtest, используйте команду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/shecho "Is it morning? Please answer yes or no "read timeofdayif [ $timeofday = "yes" ]; thenecho "Good morning"elseecho "Good afternoon"fiexit 0В результате будет получен следующий вывод на экран:
Is it morning? Please answer yes or no<b>yes</b>Good morning$В этом сценарии для проверки содержимого переменной
применяется командаtimeofday. Результат оценивается оператором командной оболочки[, который затем разрешает выполнять разные строки программного кода.ifПримечаниеОбратите внимание на дополнительные пробелы, используемые для формирования отступа внутри оператора
. Это делается только для удобства читателя; командная оболочка игнорирует дополнительные пробелы.ifelifК сожалению, с этим простым сценарием связано несколько проблем. Во-первых, он принимает в значении
(нет) любой ответ за исключениемno(да). Можно помешать этому, воспользовавшись конструкциейyes, которая позволяет добавить второе условие, проверяемое при выполнении частиelifоператораelse(упражнение 2.3).ifУпражнение 2.3. Выполнение проверок с помощьюelifВы можете откорректировать предыдущий сценарий так, чтобы он выводил сообщение об ошибке, если пользователь вводит что-либо отличное от
илиyes. Для этого замените веткуnoветкойelseи добавьте еще одно условие:elif#!/bin/shecho "Is it morning? Please answer yes or no "read timeofdayif [ $timeofday = "yes" ]thenecho "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>fiexit 0Как это работает
Этот пример очень похож на предыдущий, но теперь, если первое условие не равно
, оператор командной оболочкиtrueпроверяет переменную снова. Если обе проверки не удачны, выводится сообщение об ошибке, и сценарий завершается со значением 1, которое в вызывающей программе можно использовать для проверки успешного выполнения сценария.elif