Конструкция while (пока) образует цикл, который подлежит выполнению до тех пор, пока команда while определяет условие как true.
В операторе while используется следующий формат:
while список_w do список_d done
где while – служебное слово определяющее тип цикла с истинным условием, а слова do и done служат маркерами блока. Для того чтобы этот блок был всегда виден, команды в этом списке следует записывать с отступом.
«Список_w» называется «списком while» и состоит из одной или более команд, разделенных точками с запятой или символами новой строки. Эти команды, которые могут содержать аргументы, переназначения, конвейеризацию, вызовы других сценариев и все другие командные механизмы, выполняются как обычно. То, что происходит дальше, зависит от кода завершения последней команды в «списке_w».
Код завершения передается командному процессору и показывает, как выполнилась команда. Обращаться к этому числу можно с помощью специального позиционного параметра $?.
Нулевой статус выхода означает true (т.е. успешное выполнение команды), а ненулевой – false (команда по какой–то причине выполнилась неуспешно). С помощью различных ненулевых статусов программисты могут указывать причину неуспешного выполнения. Истина одна, а ложь многолика.
«Список_d» называется «списком do». Если статус выхода последней команды в «списке_w» является true, то выполняются команды в «списке_d» между do и done, а затем управление возвращается команде while. «Список_w» выполняется снова и т.д., если статус выхода в «списке_d» примет значение false, то команды в «списке_d» пропускаются, а выполнение возобновляется с команды, следующей за оператором done.
Оператор цикла until имеет структуру:
until условие do список команд done
где until – служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (между do и done) повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие не должно выполняться.
Отличие от оператора while состоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) после каждого (в том числе и первого!) выполнения команд тела цикла.
Итак, в интерпретаторе shell есть два вида циклов, в которых запускается команда и проверяется ее код завершения. Цикл until продолжается, пока команда возвращает ненулевой код, а цикл while – пока команда возвращает нулевой код. Выбор между while и until зависит от типа проверяемого условия. Иногда «положительное» условие while является более естественным и более простым в проверке. В других случаях более естественным будет «отрицательное» условие until.
Например, сравните следующие два примера:
while sleep 60
do
who | grep user1
done
until who | grep user1
do
sleep 60
done…
Обе эти версии будут каждые 60 с опрашивать список пользователей и смотреть, зарегистрировался ли пользователь user1. Версия until имеет то преимущество, что если пользователь user1 зарегистрировался в системе, то выход выполняется немедленно. В версии с while деактивация происходит перед проверкой, и после регистрации user1 она будет сообщать вам об этом каждую минуту (пока вы ее не прервете, или пока пользователь user1 не выйдет из системы).
Например:
while test –r file1 do sleep 5 done
Эта программа ожидает удаление файла file1, она определяет, читаем ли мы file1, и если да, то по команде 'sleep 5' засыпает на 5 с. После удаления file1 в результате проверки устанавливается значение false, и выполнение условного оператора заканчивается.