Работа с циклом while в оболочке bash
Содержание
Теоретическое введение
Цикл while — это конструкция, которая позволяет многократно выполнять код или команды в зависимости от заданного условия. Например, запустить команду echo n раз или прочитать текстовый файл построчно.
while [condition]
do
command
done
Сначала выполняется проверка на правильность условия, если условие true, то do инициализирует выполнение команд, указанных в теле цикла, done свидетельствует об окончании их выполнения, цикл начинается снова, пока на проверку не поступит false.
Бесконечные циклы
Бесконечные циклы возникают, если false не поступает никогда, к примеру, если задать заведомо истинное условие:
while [1 = 1]
do
echo “Always equal”
done
Также бесконечные циклы можно задать, используя встроенную команду : , которая всегда возвращает true
while :
do
echo "Press <CTRL+C> to exit."
sleep 1
done
Данный цикл будет работать бесконечно, пока пользователь не нажмет CTRL+C.
Способы записи циклов
Для любого цикла, записанного в несколько строк, существует однострочный эквивалент, правила записи которого почти не отличаются от тех, что были описаны в теоретическом введении, вот, как будет выглядеть код выше, записанный в одной строке:
while :; do echo 'Press <CTRL+C> to exit.'; sleep 1; done
Операторы break и continue
break и continue могут быть использованы для управления выполнением цикла while.
Оператор break завершает текущий цикл и переходит к команде, следующей за прерванным циклом, используется для завершения цикла при выполнении определенного условия.
В следующем примере выполнение цикла будет прервано, как только текущий элемент будет равен 2.
i=0
while [ $i -lt 5 ]
do
echo "Number: $i"
((i++))
if [[ "$i" == '2' ]]; then
break
fi
done
echo 'Yeah, we did it!'
Когда в теле цикла встречается команда continue, то текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Continue может использоваться для исключения определённых значений из вывода. Например, когда элемент равен 2 программа вернется к началу цикла и продолжить со следующей итерации:
i=0
while [ $i -lt 5 ]
do
((i++))
if [[ "$i" == '2' ]]; then
continue
fi
echo "Number: $i"
done
echo 'Done it!'
Как читать файл построчно?
Одним из наиболее распространенных применений while цикла является построчное чтение файла, потока данных или переменной.
Вот пример, который читает /myfiles/linux/while файл построчно и печатает каждую строку:
file=/myfiles/linux/while
while read -r line;
do
echo $line
done < "$file"
Вместо того, чтобы использовать цикл while с обычным условием, мы используем redirection (< "$file"), чтобы передать файл команде read, которая стоит на месте условия в цикле.
Интересные примеры применения цикла while
Перебор переданных скрипту параметров.
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1"
count=$(( $count + 1 ))
shift
done
Считывание переданных ключей
Ключи командной строки обычно выглядят как буквы, перед которыми ставится тире. Они служат для управления сценариями.
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option" ;;
-c) echo "Found the -c option" ;;
*) echo "$1 is not an option" ;;
esac
shift
done
Задачи для самостоятельного решения
- Напишите скрипт, который будет выводить слово Linux на экран пять раз.
- Создайте файл, содержащий 10 различных строк и построчно считайте его, вывод должен выглядеть так: "Строка N: прочитанная строка N из файла", где N - номер строки в файле.
- По мере усложнения скриптов, может возникнуть ситуация, когда обычных ключей уже н будет достаточно: необходимо будет использовать ключи с некими значениями. Напишите скрипт, который умеет определять, когда вместе с ключами командной строки используются дополнительные параметры, используя цикл while.