Bash-скрипты — цикл while

Опубликовано: 30 Сентября, 2022

Цикл while — это оператор, который выполняет итерацию по блоку кода до тех пор, пока указанное условие не станет истинным. Мы можем использовать этот оператор или цикл в нашей программе, когда не знаем, сколько раз условие будет оцениваться как ложное, прежде чем оно станет истинным.

Синтаксис цикла while в BASH выглядит примерно так:

while [ condition ];
do
    # statements
    # commands
done  

Если условие ложно, то команды внутри блока while выполняются и повторяются снова после проверки условия. Кроме того, если условие истинно, операторы внутри блока while пропускаются, а операторы после блока while выполняются.

Пример цикла while выглядит следующим образом:

#!/usr/bin/bash 

a=7
while [ $a -gt 4 ];
do
    echo $a
    ((a--))
done

echo "Out of the loop"

Как мы видим, цикл повторяется до тех пор, пока условие не станет истинным. Как только переменная a становится равной 4, условие оценивается как истинное, и цикл пропускает блок команд и начинает выполнять команды после блока.

Чтение файла с помощью цикла while

Мы можем прочитать файл с помощью цикла while в BASH. Анализируя определенные параметры в соответствии с условием цикла while, мы можем перебирать файл построчно или по другим группам, таким как символы или слова.

#!/usr/bin/bash 

file=temp.txt

while read -r line;
do
    echo $line
done < "$file"

Мы используем команду read для фактического извлечения строк или символов из файла. Команда чтения передается с аргументом -r, который игнорирует экранирование символов, если появляется , и, следовательно, он анализируется как его. Мы читаем строку из файла, упомянутого после оператора done. Команда read читает строку из указанного файла, а циклы while заканчиваются, когда читается последняя строка из файла (ни одной строки для чтения не остается).

Вот как мы можем прочитать содержимое файла, используя цикл while в BASH.

Бесконечный цикл while

Чтобы создать бесконечный цикл, используйте оператор цикла while. Нам не нужно помещать какие-либо условия в цикл while, и, следовательно, цикл повторяется бесконечно. Ниже приведен пример бесконечного цикла while:

#!/usr/bin/bash 

while :
do
  echo "An Infinite loop"
  # We can press Ctrl + C to exit the script
done

Таким образом, цикл while в скрипте будет повторяться бесконечное время. Мы можем вручную разорвать цикл или скрипт, нажав CTRL + C.

Цикл while для повторения фиксированное количество раз

Мы можем использовать цикл while для повторения фиксированного количества раз, мы можем установить условие равным -le или меньше числа, и цикл будет повторяться до тех пор, пока итератор не станет меньше или равен числу, указанному в состояние. Кроме того, нам нужно увеличить итератор вручную, чтобы итератор цикла продолжал тикать, иначе цикл будет продолжаться вечно.

#!/usr/bin/bash 

i=1

# the number 4 can be the limit to 
# iterate the loop
while [ $i -le 4 ];
do
    echo $i
    ((i++))
done

В приведенном выше примере мы видим, что цикл повторяется определенное количество раз. Поскольку мы инициализировали счетчик равным 1, и условие состоит в том, чтобы повторять цикл до тех пор, пока итератор не станет меньше или равен числу, в данном случае 4. Таким образом, мы можем изменить число в условии в соответствии с нашим требованием.

Прочитайте аргумент командной строки с параметрами getopts

Мы можем использовать параметры get ops для чтения ввода из командной строки, и если есть несколько аргументов, мы можем проверить их и проанализировать их один за другим, используя цикл while. getopts — это инструмент для получения пользовательского ввода из командной строки. У нас может быть несколько параметров для анализа из командной строки, а с помощью getopts и циклов while мы можем создать профессионально выглядящую программу пользовательского ввода.

#!/bin/bash

while getopts n:a: OPT
do
        case "${OPT}"
        in
           n) name=${OPTARG};;
           a) age=${OPTARG};;
           *) echo "Invalid option"
              exit 1;;
        esac
done

printf "My name is $name and am $age years old
"

В этом случае у нас есть два варианта, а именно имя и возраст, у вас может быть несколько вариантов. Нам нужно указать, какую опцию мы будем использовать в операторах switch case и из командной строки, используя опцию -shorthand. В этом случае мы использовали -n для имени и -a для возраста . У нас также есть проверка по умолчанию или недопустимый регистр, чтобы мы не анализировали неправильные аргументы. Мы можем присвоить значение опции, используя переменную OPTARG , которая анализирует значение, предоставленное опции.

Цикл while здесь используется для итерации до тех пор, пока из командной строки не будут переданы параметры. Мы проверяем параметры -n и -a и повторяем до тех пор, пока не будет нажата клавиша возврата каретки или ввода и не будет больше вариантов для анализа.

Цикл while в стиле C

Мы можем использовать цикл while в стиле C в BASH, переменные должны оцениваться в стиле BASH, но общий синтаксис похож на C. Мы можем использовать такие операторы, как <,>, <= и т. д. в условиях цикла while и, следовательно, он вызывается как цикл while в стиле C.

#!/bin/bash

i=0
while((i < 12))
do
   echo $i
   ((i+=2))
done

В этом примере мы видим, что цикл while имеет условие с операторами, отличными от bash, такими как -le, -ge и т. д., вместо этого мы используем операторы в стиле C в условии. Остальная часть цикла является основным циклом, как в BASH, переменная или итератор i увеличивается на два, как мы можем видеть в последнем операторе тела цикла. Таким образом, цикл повторяется более 5 раз.

Цикл while для выполнения операций над файлом

Мы можем выполнять операции над файлом, например читать только определенную часть файла. Если у нас есть столбцы, отформатированные определенным образом, мы можем использовать переменные для их присвоения и вывода данных в одну строку за раз.

#!/bin/bash

while read a b c 
do
    echo $b - $a
done < wh.txt

В этом примере у нас есть три строки, мы читаем содержимое, присваивая его переменным a, b и c, это может быть что угодно, но не забудьте использовать их в теле цикла. Мы можем выбрать конкретный столбец, такой как b и a, и можем распечатать или выполнить с ними любые операции. Это не будет отражено в файле, так как это всего лишь локальные переменные скрипта.

Запись в файл с использованием цикла while

Мы можем писать в файл с помощью пользовательского ввода в цикле while. Мы можем использовать цикл while для итерации до тех пор, пока мы вручную не выйдем из цикла, используя CTRL + D, сохранив изменения в файле, или CTRL + C, чтобы избежать записи в файл. Мы используем команду чтения, чтобы ввести текст из командной строки и разобрать его в файл.

#! /bin/bash

file=wh.txt
echo "Enter the content into the file $file"
while read line
do
    echo $line >> $file
done

Итак, в приведенном выше примере мы смогли ввести текст в файл, используя цикл while и команду чтения. Чтобы выйти из цикла и сохранить изменения в файле, мы используем клавиши CTRL+D, а чтобы выйти из цикла без сохранения чего-либо в файл, мы можем использовать клавиши CTRL+C. Таким образом, мы вводим текст из командной строки в текстовый файл, используя команду чтения и цикл while.

Перерыв и продолжение

Break и continue необходимы в программе, которая имеет дело с операторами цикла, поскольку они управляют потоком операторов цикла без каких-либо явных условий.

Заявление о перерыве

Мы используем операторы break для выхода из цикла, не дожидаясь, пока условие цикла while станет истинным. Этот оператор может использоваться внутри блока цикла. Это можно использовать для выхода из бесконечного цикла с программным условием внутри цикла и, таким образом, для сохранения контроля над циклом.

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

#!/usr/bin/bash 

i=1
while :
do
    echo $i
    if [ $i -eq 20 ];
    then
        echo "This is end of the loop"
        break
    if
    ((i++))
done

Из сценария и выполнения мы видим, что нам удалось прервать или выйти из бесконечного цикла с помощью условного оператора и оператора break. Таким образом, оператор break используется для получения потока управления программой/скриптом внутри цикла while, чтобы выйти из цикла без оценки условия цикла как истинного.

Продолжить заявление

Мы можем использовать оператор continue, чтобы сделать противоположное оператору break. Он перейдет к началу блока цикла и повторит итерацию снова. Это можно использовать для пропуска определенных команд при определенных условиях и, следовательно, позволяет изменить ход цикла.

Например, если у нас есть переменная, инициализированная значением 1, и мы хотим отображать только числа, делящиеся на пять, или по определенному шаблону в соответствии с условием, мы можем использовать операторы continue, чтобы сделать именно это. Это позволяет повторять цикл желаемым образом.

#!/usr/bin/bash 

i=1
while [ $i -lt 30 ];
do
    ((i++))
    if [[ $(( $i % 5 )) -ne 0 ]];
    then
        continue
    if
    echo $i
done

Как мы видим, оператор continue переходит к началу блока и начинает выполнение команд, пропуская следующие команды внутри блока. Цикл while повторяется только для значения переменной i меньше 30, поэтому условие if проверяет, делится ли переменная i на 5, и если это не так, мы повторяем снова, используя continue и увеличивая значение переменной i. Переменная i отображается только в том случае, если она делится на 5, поэтому условие if оценивается как ложное, и мы не сталкиваемся с оператором continue и переносимся в нормальном потоке цикла. Это делается для того, чтобы избежать регистрации каждого числа и печатать только те числа, которые не соответствуют шаблону или условию в операторе if или других условных операторах.