В третьей части по изучению Bash мы углубимся в использование цикла while, который позволяет многократно выполнять код в зависимости от заданного условия, рассмотрим основные принципы работы цикла, способы записи, и как избежать бесконечных циклов. Также обсудим применение операторов break и continue для управления циклом, и продемонстрируем, как эффективно читать файл построчно с помощью while. В конце приведем интересные примеры, включая перебор параметров скрипта и считывание ключей командной строки.
Цикл 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 могут быть использованы для управления выполнением цикла 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, которая стоит на месте условия в цикле.
Перебор переданных скрипту параметров:
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
Источник:
https://cs.mipt.ru/gertsev/os-linux/lessons/09_cycle_while.html