Основы программирования в Linux
Командная оболочка раскрывает
, подставляя имена всех файлов, соответствующих данному шаблону.f*.shПримечаниеПомните о том, что все подстановки переменных в сценариях командной оболочки делаются во время выполнения сценария, а не в процессе их написания, поэтому все синтаксические ошибки в объявлениях переменных обнаруживаются только на этапе выполнения, как было показано ранее, когда мы заключали в кавычки пустые переменные.
whileПоскольку по умолчанию командная оболочка считает все значения строками, оператор
хорош для циклической обработки наборов строк, но не слишком удобен, если вы не знаете заранее, сколько раз придется его выполнить.forЕсли нужно повторить выполнение последовательности команд, но заранее не известно, сколько раз следует их выполнить, вы, как правило, будете применять цикл
со следующей синтаксической записью:while<b>while</b> <i>условие</i><b>do</b><i> операторы</i><b>done</b>Далее приведен пример довольно слабой программы проверки паролей.
#!/bin/shecho "Enter password"read trythiswhile [ "$trythis" != "secret" ]; doecho "Sorry, try again"read trythisdoneexit 0Следующие строки могут служить примером вывода данного сценария:
Enter password<b>password</b>Sorry, try again<b>secret</b>$Ясно, что это небезопасный способ выяснения пароля, но он вполне подходит для демонстрации применения цикла
. Операторы, находящиеся между операторамиwhileиdo, выполняются бесконечное число раз до тех пор, пока условие остается истинным (done). В данном случае вы проверяете, равно ли значение переменнойtrueстрокеtrythis. Цикл будет выполняться, покаsecretне равно$trythis. Затем выполнение сценария продолжится с оператора, следующего сразу за операторомsecret.doneuntilУ цикла
следующая синтаксическая запись:until<b>until</b> <i>условие</i><b>do</b><i> операторы</i><b>done</b>Она очень похожа на синтаксическую запись цикла
, но с обратным проверяемым условием. Другими словами, цикл продолжает выполняться, покаwhileне станет истинным (true).условиеПримечаниеКак правило, если нужно выполнить цикл хотя бы один раз, применяют цикл
; если такой необходимости нет, используют циклwhile.untilКак пример цикла
можно установить звуковой сигнал предупреждения, инициируемый во время регистрации нового пользователя, регистрационное имя которого передается в командную строку.until#!/bin/bashuntil who | grep "$1" > /dev/nulldosleep 60done# Теперь звонит колокольчик и извещает о новом пользователеecho -е '\а'echo "**** $1 has just logged in ****"exit 0Если пользователь уже зарегистрировался в системе, выполнять цикл нет необходимости. Поэтому естественно выбрать цикл
, а не циклuntil.whilecaseОператор
немного сложнее уже рассмотренных нами операторов. У него следующая синтаксическая запись:case<b>case</b><i> переменная</i> <b>in</b><i> образец</i> [ | <i>образец</i>] ...) <i>операторы</i>;;<i>образец</i> [ | <i>образец</i>] ...)<i> операторы</i>;;<b>esac</b>Конструкция оператора
выглядит слегка устрашающей, но она позволяет довольно изощренным способом сопоставлять содержимое переменной с образцами и затем выполнять разные операторы в зависимости от того, с каким образцом найдено соответствие. Это гораздо проще, чем проверять несколько условий, применяемых во множественных операторахcase,ifиelif.elseПримечаниеОбратите внимание на то, что каждая ветвь с образцами завершается удвоенным символом "точка с запятой" (
). В каждой ветви оператора;;можно поместить несколько операторов, поэтому сдвоенная точка с запятой необходима для отметки завершения очередного оператора и начала следующей ветви с новым образцом в оператореcase.caseВозможность сопоставлять многочисленные образцы и затем выполнять множественные связанные с образцом операторы делают конструкцию
очень удобной для обработки пользовательского ввода. Лучше всего увидеть, как работает конструкцияcaseна примерах. Мы будем применять ее в упражнениях 2.6–2.8, каждый раз совершенствуя сопоставление с образцами.caseПримечаниеПрименяя конструкцию
с метасимволами в образцах, такими какcase, будьте особенно внимательны. Проблема заключается в том, что принимается во внимание первое найденное соответствие образцу, несмотря на то, что в последующих ветвях могут быть образцы с более точным соответствием.*