Программирование

Bash. Часть 3. Цикл while

В третьей части по изучению 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

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

Источник:
https://cs.mipt.ru/gertsev/os-linux/lessons/09_cycle_while.html