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








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

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

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

Команды break и continue

Встроенная команда break

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

В приведенном ниже примере продемонстрирован цикл while, который может быть прерван. Это слегка улучшенная версия скрипта wisdom.sh из раздела "Использование клавиатуры для управления циклом while".

#!/bin/bash

# This script provides wisdom
# You can now exit in a decent way.

FORTUNE=/usr/games/fortune

while true; do
echo "On which topic do you want advice?"
echo "1.  politics"
echo "2.  startrek"
echo "3.  kernelnewbies"
echo "4.  sports"
echo "5.  bofh-excuses"
echo "6.  magic"
echo "7.  love"
echo "8.  literature"
echo "9.  drugs"
echo "10. education"
echo

echo -n "Enter your choice, or 0 for exit: "
read choice
echo

case $choice in
     1)
     $FORTUNE politics
     ;;
     2)
     $FORTUNE startrek
     ;;
     3)
     $FORTUNE kernelnewbies
     ;;
     4)
     echo "Sports are a waste of time, energy and money."
     echo "Go back to your keyboard."
     echo -e "\t\t\t\t -- \"Unhealthy is my middle name\" Soggie."
     ;;
     5)
     $FORTUNE bofh-excuses
     ;;
     6)
     $FORTUNE magic
     ;;
     7)
     $FORTUNE love
     ;;
     8)
     $FORTUNE literature
     ;;
     9)
     $FORTUNE drugs
     ;;
     10)
     $FORTUNE education
     ;;
     0)
     echo "OK, see you!"
     break
     ;;
     *)
     echo "That is not a valid choice, try a number from 0 to 10."
     ;;
esac  
done

Помните, что с помощью команды break выполняется выход из цикла, а не из скрипта. Это можно продемонстрировать при помощи добавления команды echo в конце скрипта. Эта команда echo также будет выполнена при вводе данных, которые послужат причиной выполнения команды break (когда пользователь вводит "0").

Во вложенных циклах в команде break можно указать, из какого цикла происходит выход. Дополнительную информацию смотрите в документации.

Встроенная команда continue

Инструкция continue позволяет в циклах for, while, until или select перейти к следующему шагу итерации.

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

Примеры

В следующем примере имена файлов преобразуются в нижний регистр. Если преобразование делать не нужно, команда continue перезапускает выполнение цикла. Эти команды не затрачивают много системных ресурсов, и, скорее всего, подобные проблемы можно решать с помощью sed и awk. Тем не менее, об этой возможности полезно знать, когда выполняется работа, на которую затрачивается много ресурсов, причем больших затрат даже вообще может не быть, если проверки вставляются в скриптах в тех местах, где происходит обращение к системным ресурсам.

[carol@octarine ~/test] cat tolower.sh
#!/bin/bash

# This script converts all file names containing upper case characters into file
# names containing only lower cases.

LIST="$(ls)"

for name in "$LIST"; do

if [[ "$name" != *[[:upper:]]* ]]; then
continue
fi

ORIG="$name"
NEW=`echo $name | tr 'A-Z' 'a-z'`

mv "$ORIG" "$NEW"
echo "new name for $ORIG is $NEW"
done

В этом скрипте есть, по крайней мере, один недостаток: он переписывает существующие файлы. Параметр noclobber, имеющийся в Bash, полезен только в случае, когда осуществляется перенаправление. Большую надежность обеспечивает параметр -b, указываемый в команде mv, но это надежно только, если произойдет случайная перезапись, так как это продемонстрировано в следующем тесте:

[carol@octarine ~/test] rm *

[carol@octarine ~/test] touch test Test TEST

[carol@octarine ~/test] bash -x tolower.sh
++ ls
+ LIST=test
Test
TEST
+ [[ test != *[[:upper:]]* ]]
+ continue
+ [[ Test != *[[:upper:]]* ]]
+ ORIG=Test
++ echo Test
++ tr A-Z a-z
+ NEW=test
+ mv -b Test test
+ echo 'new name for Test is test'
new name for Test is test
+ [[ TEST != *[[:upper:]]* ]]
+ ORIG=TEST
++ echo TEST
++ tr A-Z a-z
+ NEW=test
+ mv -b TEST test
+ echo 'new name for TEST is test'
new name for TEST is test

[carol@octarine ~/test] ls -a
./  ../  test  test~

Команда tr является частью пакета textutils; она может выполнять все виды символьных преобразований.


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