Циклы в Bash

Как и в любом другом языке, циклы очень удобны. С Bash вы можете использовать forциклы, whileциклы и untilциклы.

for

Вот структура цикла for:

for var in ${list}
do
    your_commands
done

Пример:

#!/bin/bash

users="devdojo bobby tony"

for user in ${users}
do
    echo "${user}"
done

Краткое изложение примера:

  • Сначала мы указываем список пользователей и сохраняем значение в переменной с именем $users.

  • После этого мы начинаем наш forцикл с forключевого слова.

  • Затем мы определяем новую переменную, которая будет представлять каждый элемент из предоставленного нами списка. В нашем случае мы определяем переменную с именем user, которая будет представлять каждого пользователя из этой $usersпеременной.

  • Затем мы указываем inключевое слово, за которым следует наш список, по которому мы будем проходить.

  • В следующей строке мы используем doключевое слово, которое указывает, что мы будем делать на каждой итерации цикла.

  • Затем мы указываем команды, которые хотим запустить.

  • Наконец, мы замыкаем цикл ключевым doneсловом.

Вы также можете использовать forдля обработки ряда чисел. Например, вот один из способов пройти от 1 до 10:

#!/bin/bash

for num in {1..10}
do
    echo ${num}
done

while

Структура цикла while очень похожа на сам forцикл:

while [ your_condition ]
do
    your_commands
done

Вот пример цикла while:

#!/bin/bash

counter=1
while [[ $counter -le 10 ]]
do
    echo $counter
    ((counter++))
done

Сначала мы указали переменную-счетчик и установили для нее значение 1, затем внутри цикла мы добавили счетчик, используя этот оператор: ((counter++)). Таким образом, мы гарантируем, что цикл будет выполняться только 10 раз и не будет выполняться вечно. Цикл завершится, как только счетчик станет равным 10, поскольку это то, что мы установили в качестве условия: while [[ $counter -le 10 ]].

Давайте создадим скрипт, который запрашивает у пользователя имя и не допускает пустой ввод:

#!/bin/bash

read -p "What is your name? " name

while [[ -z ${name} ]]
do
    echo "Your name can not be blank. Please enter a valid name!"
    read -p "Enter your name again? " name
done

echo "Hi there ${name}"

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

until

Разница между циклами untilи whileзаключается в том, что untilцикл будет выполнять команды внутри цикла до тех пор, пока условие не станет истинным.

Состав:

until [[ your_condition ]]
do
    your_commands
done

Пример:

#!/bin/bash

count=1
until [[ $count -gt 10 ]]
do
    echo $count
    ((count++))
done

continue & break

Как и в случае с другими языками, вы также можете использовать continueи со своими bash-скриптами:break

  • continueсообщает вашему bash-скрипту, что нужно остановить текущую итерацию цикла и начать следующую итерацию.

Синтаксис оператора continue следующий:

continue [n]

Аргумент [n] является необязательным и может быть больше или равен 1. Когда задан [n], возобновляется n-й охватывающий цикл. продолжить 1 эквивалентно продолжению.

#!/bin/bash

for i in 1 2 3 4 5
do
    if [[ $i –eq 2 ]] 
    then
        echo "skipping number 2"
    continue
    fi
    echo "i is equal to $i"
done

Мы также можем использовать команду continue аналогично команде прерывания для управления несколькими циклами.

  • breakсообщает вашему bash-скрипту немедленно завершить цикл.

Синтаксис оператора Break имеет следующую форму:

break [n]

[n] является необязательным аргументом и должен быть больше или равен 1. Если указан [n], происходит выход из n-го охватывающего цикла. перерыв 1 эквивалентен перерыву.

Пример:

#!/bin/bash

num=1
while [[ $num –lt 10 ]] 
do
    if [[ $num –eq 5 ]] 
    then
        break
    fi
    ((num++))
done
echo "Loop completed"

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

Пример:

#!/bin/bash

for (( a = 1; a < 10; a++ ))
do
    echo "outer loop: $a"
    for (( b = 1; b < 100; b++ ))
    do
        if [[ $b –gt 5 ]] 
        then
            break 2
        fi
    echo "Inner loop: $b "
    done
done

Сценарий bash начнется с a=1 и перейдет во внутренний цикл, а когда он достигнет b=5, он разорвет внешний цикл. Мы можем использовать только прерывание вместо прерывания 2, чтобы прервать внутренний цикл и посмотреть, как это повлияет на результат.

Last updated