Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 9: Повторяющиеся задачи Вперед

Цикл типа until

Что это такое?

Цикл until очень похож на цикл while, за исключением лишь того, что цикл выполняется до тех пор, пока команда TEST-COMMAND не будет успешно выполнена. До тех пор, пока эта команда возвращает код неудачного выполнения, выполнение цикла будет продолжаться. Синтаксис такой же, как и для цикла while:

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done 

Кодом возврата будет код возврата последней команды, выполненной в списке CONSEQUENT-COMMANDS, или ноль, если ни одна из команд не выполнялась. В качестве команды TEST-COMMAND может, опять же, быть любая команда, которая возвращает различные коды в случае успеха и в случае неудачи, а в качестве команд CONSEQUENT-COMMANDS могут быть любые команды UNIX, скрипты или конструкции командной оболочки.

Как мы ранее объясняли, символ ";" везде, где он появляется, можно заменять одним или несколькими символами новой строки.

Пример

Это улучшенный скрипт picturesort.sh (смотрите раздел "Вложенные циклы while"), в котором проверяется наличие на диске свободного места. Если на диске недостаточно свободного места, то удаляются фотографии, сделанные в предыдущих месяцах:

#!/bin/bash

# This script copies files from my homedirectory into the webserver directory.
# A new directory is created every hour.
# If the pics are taking up too much space, the oldest are removed.

while true; do 
        DISKFUL=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -)

        until [ $DISKFUL -ge "90" ]; do 

                DATE=`date +%Y%m%d`
                HOUR=`date +%H`
                mkdir $WEBDIR/"$DATE"
                                                                                
                while [ $HOUR -ne "00" ]; do
                        DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
                        mkdir "$DESTDIR"
                        mv $PICDIR/*.jpg "$DESTDIR"/
                        sleep 3600
                        HOUR=`date +%H`
                done

        DISKFULL=$(df -h $WEBDIR | grep -v File | awk '{ print $5 }' | cut -d "%" -f1 -)
        done

        TOREMOVE=$(find $WEBDIR -type d -a -mtime +30)
        for i in $TOREMOVE; do
                rm -rf "$i";
        done

done

Обратите внимание на инициализацию переменных HOUR и DISKFULL и на то, как в командах ls и date используются параметры для получения в TOREMOVE (на удаление) правильного списка фотографий.


Предыдущий раздел: Оглавление Следующий раздел:
Цикл типа while   Перенаправление ввода/вывода и циклы