[ "$n" = ".iso.opts" ] && continue
[ -r .Iso.$beta ] && continue
[ -r .lock.$beta ] && sleep 10 && continue
lockfile -r0 .lock.$beta || continue
[ -r .Iso.$beta ] && rm -f .lock.$beta
# Конкретная реализация цикла, особенно sleep N, зависит от конкретных применений,
#+ но в общем случае он строится по такой схеме:
{файл уже обработан или обрабатывается} && continue
{пометить файл как обрабатываемый, обработать, пометить как обработанный}
break # Или что нибудь подобное `sleep 600', чтобы избежать завершения.
# Этот сценарий завершит работу после того как все данные будут обработаны
#+ (включая данные, которые поступили во время обработки). Использование
#+ соответствующих lock-файлоа позволяет вести обработку на нескольких машинах
#+ одновременно, не производя дублирующих вычислений [которые, в моем случае,
#+ выполняются в течении нескольких часов, так что для меня это очень важно].
#+ Кроме того, поскольку поиск необработанных файлов всегда начинается с
#+ самого начала, можно задавать приоритеты в именах файлов. Конечно, можно
#+ обойтись и без `continue 2', но тогда придется ввести дополнительную
#+ проверку -- действительно ли был обработан тот или иной файл
#+ (чтобы перейти к поиску следующего необработанного файла).
Конструкция continue N довольно сложна в понимании и применении, поэтому, вероятно лучше будет постараться избегать ее использования.
Инструкции case и select технически не являются циклами, поскольку не предусматривают многократное исполнение блока кода. Однако, они, как и циклы, управляют ходом исполнения программы, в зависимости от начальных или конечных условий.
Конструкция case эквивалентна конструкции switch в языке C/C++. Она позволяет выполнять тот или иной участок кода, в зависимости от результатов проверки условий. Она является, своего рода, краткой формой записи большого количества операторов if/then/else и может быть неплохим инструментом при создании разного рода меню.
case "$variable" in "$condition1" ) command... ;; "$condition2" ) command... ;; esac
Заключать переменные в кавычки необязательно, поскольку здесь не производится разбиения на отдельные слова.
Каждая строка с условием должна завершаться правой (закрывающей) круглой скобкой ).
Каждый блок команд, отрабатывающих по заданному условию, должен завершаться двумя символами точка-с-запятой ;;.
Блок case должен завершаться ключевым словом esac (case записанное в обратном порядке).
Пример 10-24. Использование case
echo; echo "Нажмите клавишу и затем клавишу Return."
[a-z] ) echo "буква в нижнем регистре";;
[A-Z] ) echo "Буква в верхнем регистре";;
* ) echo "Знак пунктуации, пробел или что-то другое";;
esac # Допускается указыватль диапазоны символов в [квадратных скобках].