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