Пример 10-13. Работа с командой efax в пакетном режиме
if [ $# -ne $EXPECTED_ARGS ]
# Проверка наличия аргументов командной строки.
echo "Порядок использования: `basename $0` phone# text-file"
echo "Файл $2 не является текстовым файлом"
fax make $2 # Создать fax-файлы из текстовых файлов.
for file in $(ls $2.0*) # Все файлы, получившиеся в результате преобразования.
# Используется шаблонный символ в списке.
efax -d /dev/ttyS3 -o1 -t "T$1" $fil # отправить.
# Как указывает S.C., в цикл for может быть вставлена сама команда отправки в виде:
# efax -d /dev/ttyS3 -o1 -t "T$1" $2.0*
# но это не так поучительно [;-)].
Оператор while проверяет условие перед началом каждой итерации и если условие истинно (если код возврата равен 0), то управление передается в тело цикла. В отличие от циклов for, циклы while используются в тех случаях, когда количество итераций заранее не известно.
while [condition] do command... done
Как и в случае с циклами for/in, при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do.
Обратите внимание: в отдельных случаях, таких как использование конструкции getopts совместно с оператором while, синтаксис несколько отличается от приводимого здесь.
Пример 10-14. Простой цикл while
while [ "$var0" -lt "$LIMIT" ]
echo -n "$var0 " # -n подавляет перевод строки.
var0=`expr $var0 + 1` # допускается var0=$(($var0+1)).
Пример 10-15. Другой пример цикла while
while [ "$var1" != "end" ] # возможна замена на while test "$var1" != "end"
echo "Введите значение переменной #1 (end - выход) "
read var1 # Конструкция 'read $var1' недопустима (почему?).
echo "переменная #1 = $var1" # кавычки обязательны, потому что имеется символ "#".
# Если введено слово 'end', то оно тоже выводится на экран.
# потому, что проверка переменной выполняется в начале итерации (перед вводом).
Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла должен быть несколько иным.
Пример 10-16. Цикл while с несколькими условиями
while echo "предыдущее значение = $previous"
previous=$var1 # запомнить предыдущее значение
# В операторе "while" присутствуют 4 условия, но только последнее управляет циклом.
# *последнее* условие - единственное, которое вычисляется.
echo "Введите значение переменной #1 (end - выход) "
echo "текущее значение = $var1"
# попробуйте самостоятельно разобраться в сценарии works.
Как и в случае с for, цикл while может быть записан в C-подобной нотации, с использованием двойных круглых скобок (см. так же Пример 9-28).