KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

Мендель Купер - Искусство программирования на языке сценариев командной оболочки

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

Как и в случае с циклами for/in, при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do.

while [condition] ; do


Обратите внимание: в отдельных случаях, таких как использование конструкции getopts совместно с оператором while, синтаксис несколько отличается от приводимого здесь.

Пример 10-14. Простой цикл while

#!/bin/bash


var0=0

LIMIT=10


while [ "$var0" -lt "$LIMIT" ]

do

echo -n "$var0 " # -n подавляет перевод строки.

var0=`expr $var0 + 1` # допускается var0=$(($var0+1)).

done


echo


exit 0

Пример 10-15. Другой пример цикла while

#!/bin/bash


echo


while [ "$var1" != "end" ] # возможна замена на while test "$var1" != "end"

do

echo "Введите значение переменной #1 (end - выход) "

read var1 # Конструкция 'read $var1' недопустима (почему?).

echo "переменная #1 = $var1" # кавычки обязательны, потому что имеется символ "#".

# Если введено слово 'end', то оно тоже выводится на экран.

# потому, что проверка переменной выполняется в начале итерации (перед вводом).

echo

done


exit 0

Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла должен быть несколько иным.

Пример 10-16. Цикл while с несколькими условиями

#!/bin/bash


var1=unset

previous=$var1


while echo "предыдущее значение = $previous"

echo

previous=$var1 # запомнить предыдущее значение

[ "$var1" != end ]

# В операторе "while" присутствуют 4 условия, но только последнее управляет циклом.

# *последнее* условие - единственное, которое вычисляется.

do

echo "Введите значение переменной #1 (end - выход) "

read var1

echo "текущее значение = $var1"

done


# попробуйте самостоятельно разобраться в сценарии works.


exit 0

Как и в случае с for, цикл while может быть записан в C-подобной нотации, с использованием двойных круглых скобок (см. так же Пример 9-28).

Пример 10-17. C-подобный синтаксис оформления цикла while

#!/bin/bash

# wh-loopc.sh: Цикл перебора от 1 до 10.


LIMIT=10

a=1


while [ "$a" -le $LIMIT ]

do

echo -n "$a "

let "a+=1"

done # Пока ничего особенного.


echo; echo


# +=================================================================+


# А теперь оформим в стиле языка C.


((a = 1)) # a=1

# Двойные скобки допускают наличие лишних пробелов в выражениях.


while (( a <= LIMIT )) # В двойных скобках символ "$" перед переменными опускается.

do

echo -n "$a "

((a += 1)) # let "a+=1"

# Двойные скобки позволяют наращивание переменной в стиле языка C.

done


echo


# Теперь, программисты, пишущие на C, могут чувствовать себя в Bash как дома.


exit 0

Стандартное устройство ввода stdin, для цикла while, можно перенаправить на файл с помощью команды перенаправления < в конце цикла.

until

Оператор цикла until проверяет условие в начале каждой итерации, но в отличие от while итерация возможна только в том случае, если условие ложно.

until [condition-is-true] do command... done


Обратите внимание: оператор until проверяет условие завершения цикла ПЕРЕД очередной итерацией, а не после, как это принято в некоторых языках программирования.

Как и в случае с циклами for/in, при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do.

until [condition-is-true] ; do


Пример 10-18. Цикл until

#!/bin/bash


until [ "$var1" = end ] # Проверка условия производится в начале итерации.

do

echo "Введите значение переменной #1 "

echo "(end - выход)"

read var1

echo "значение переменной #1 = $var1"

done


exit 0


10.2. Вложенные циклы

Цикл называется вложенным, если он размещается внутри другого цикла. На первом проходе, внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. И так до тех пор, пока не завершится внешний цикл. Само собой, как внешний, так и внутренний циклы могут быть прерваны командой break.

Пример 10-19. Вложенный цикл

#!/bin/bash

# Вложенные циклы "for".


outer=1 # Счетчик внешнего цикла.


# Начало внешнего цикла.

for a in 1 2 3 4 5

do

echo "Итерация #$outer внешнего цикла."

echo "---------------------"

inner=1 # Сброс счетчика вложенного цикла.


# Начало вложенного цикла.

for b in 1 2 3 4 5

do

echo "Итерация #$inner вложенного цикла."

let "inner+=1" # Увеличить счетчик итераций вложенного цикла.

done

# Конец вложенного цикла.


let "outer+=1" # Увеличить счетчик итераций внешнего цикла.

echo # Пустая строка для отделения итераций внешнего цикла.

done

# Конец внешнего цикла.


exit 0

Демонстрацию вложенных циклов "while" вы найдете в Пример 25-6, а вложение цикла "while" в "until" -- в Пример 25-8.


10.3. Управление ходом выполнения цикла

break, continue

Для управления ходом выполнения цикла служат команды break и continue[ 23 ] и точно соответствуют своим аналогам в других языках программирования. Команда break прерывает исполнение цикла, в то время как continue передает управление в начало цикло, минуя все последующие команды в теле цикла.

Пример 10-20. Команды break и continue в цикле

#!/bin/bash


LIMIT=19 # Верхний предел


echo

echo "Печать чисел от 1 до 20 (исключая 3 и 11)."


a=0


while [ $a -le "$LIMIT" ]

do

a=$(($a+1))


if [ "$a" -eq 3 ] || [ "$a" -eq 11 ] # Исключить 3 и 11

then

continue # Переход в начало цикла.

fi


echo -n "$a "

done


# Упражнение:

# Почему число 20 тоже выводится?


echo; echo


echo Печать чисел от 1 до 20, но взгляните, что происходит после вывода числа 2


##################################################################


# Тот же цикл, только 'continue' заменено на 'break'.


a=0


while [ "$a" -le "$LIMIT" ]

do

a=$(($a+1))


if [ "$a" -gt 2 ]

then

break # Завершение работы цикла.

fi


echo -n "$a "

done


echo; echo; echo


exit 0

Команде break может быть передан необязательный параметр. Команда break без параметра прерывает тот цикл, в который она вставлена, а break N прерывает цикл, стоящий на N уровней выше (причем 1-й уровень -- это уровень текущего цикла, прим. перев.).

Пример 10-21. Прерывание многоуровневых циклов

#!/bin/bash

# break-levels.sh: Прерывание циклов.


# "break N" прерывает исполнение цикла, стоящего на N уровней выше текущего.


for outerloop in 1 2 3 4 5

do

echo -n "Группа $outerloop: "


for innerloop in 1 2 3 4 5

do

echo -n "$innerloop "


if [ "$innerloop" -eq 3 ]

then

break # Попробуйте "break 2",

# тогда будут прерываться как вложенный, так и внешний циклы

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*