Введение
Циклы — одна из фундаментальных концепций языков программирования. Циклы полезны, когда вы хотите многократно выполнять серию команд, пока не будет выполнено определенное условие.
В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач.
В скриптах Bash есть три основные конструкции цикла: цикл for, цикл while и цикл until.
В этом уроке мы рассмотрим основы цикла for в Bash. Мы также покажем вам, как использовать операторы break и continue для изменения хода цикла.
Синтаксис
Цикл for перебирает список элементов и выполняет указанный набор команд.
Цикл for в Bash имеет следующий вид:
for item in [LIST]
do
[COMMANDS]
done
Список может быть последовательностью строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. д.
Пройтись по струнам
В следующем примере цикл будет повторять каждый элемент в списке строк, а переменная element
будет установлена на текущий элемент.
for element in Hydrogen Helium Lithium Beryllium
do
echo "Element: $element"
done
Цикл выдаст следующий результат:
Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium
Прокрутите диапазон чисел
Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, определив начальную и конечную точки для диапазона. Выражение принимает следующий вид:
{START..END}
В следующем примере цикл будет повторять все числа от 0 до 3.
for i in {0..3}
do
echo "Number: $i"
done
Number: 0
Number: 1
Number: 2
Number: 3
Начиная с Bash 4, также можно указать приращение при использовании диапазонов. Выражение принимает следующий вид:
{START..END..INCREMENT}
for i in {0..20..5}
do
echo "Number: $i"
done
Number: 0
Number: 5
Number: 10
Number: 15
Number: 20
Пройтись по элементам массива
Вы также можете использовать цикл for для перебора массива элементов:
В следующем примере мы определяем массив BOOKS
и повторяем каждый элемент массива.
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')
for book in "${BOOKS[@]}"; do
echo "Book: $book"
done
Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby
Bash для цикла C-стиль
Синтаксис в стиле C имеет следующий вид:
for ((INITIALIZATION; TEST; STEP))
do
[COMMANDS]
done
Партия INITIALIZATION
воспроизводится только один раз при запуске цикла. Затем оценивается часть TEST
. Если оно ложно, цикл for завершается. Если значение TEST
истинно, команды в теле цикла for выполняются, и часть STEP
обновляется.
В следующем коде цикл начинается с инициализации i = 0
, поэтому перед каждой итерацией он проверяет, является ли i ≤ 10
. Если true, вывести текущее значение i
и [увеличить переменную] i
на 1 ( i++
), иначе цикл завершится.
for ((i = 0 ; i <= 1000 ; i++)); do
echo "Counter: $i"
done
Цикл повторится 1001 раз и выдаст следующий результат:
Counter: 0
Counter: 1
Counter: 2...
Counter: 998
Counter: 999
Counter: 1000
Операторы break и continue
Операторы break и continue могут использоваться для управления выполнением цикла for.
Заявление о перерыве
Оператор break завершает текущий цикл и передает управление программе оператору, следующему за завершенным оператором. Обычно он используется для завершения цикла при выполнении определенного условия.
В следующем примере мы используем оператор if для прекращения выполнения цикла, как только текущий итерируемый элемент становится равным «Lithium».
for element in Hydrogen Helium Lithium Beryllium; do
if [[ "$element" == 'Lithium' ]]; then
break
fi
echo "Element: $element"
done
echo 'All Done!'
Element: Hydrogen
Element: Helium
All Done!
Продолжение заявления
Оператор continue завершает текущую итерацию цикла и передает управление программе следующей итерации цикла.
В следующем примере мы перебираем диапазон чисел, и когда текущий итерируемый элемент равен «2», оператор continue вернет выполнение к началу цикла и продолжит следующую итерацию.
for i in {1..5}; do
if [[ "$i" == '2' ]]; then
continue
fi
echo "Number: $i"
done
Number: 1
Number: 3
Number: 4
Number: 5
Примеры Bash для цикла
В следующем примере показано, как использовать цикл Bash for для переименования всех файлов в текущем каталоге с пробелом в именах путем замены пробела на символ подчеркивания.
for file in *\ *; do
mv "$file" "${file///_}"
done
Пройдемся по коду построчно:
- Первая строка создает цикл for и перебирает список всех файлов с пробелом в имени. Выражение
*\ *
создает список. - Вторая строка применяется к каждому элементу в списке и перемещает файл на новый, заменяя пробел символом подчеркивания
_
. Часть${file///_}
использует расширение параметра оболочки для замены шаблона в параметре строкой. done
указывает на конец сегмента цикла.
Изменить расширение файла
В следующем примере показано, как использовать цикл Bash for для переименования всех файлов, оканчивающихся на.jpeg, в текущем каталоге путем замены расширения файла с.jpeg на.jpg.
for file in *.jpeg; do
mv -- "$file" "${file%.jpeg}.jpg"
done
Пройдемся по коду построчно:
- Первая строка создает цикл for и перебирает список всех файлов, оканчивающихся на «.jpeg».
- Вторая строка применяется к каждому элементу в списке и перемещает файл на новый, заменяя «.jpeg» на «.jpg».
${file%.jpeg}
для удаления части «.jpeg» из имени файла с помощью расширения параметров оболочки. done
указывает на конец сегмента цикла.
Вывод
К этому моменту вы уже должны хорошо понимать, как использовать цикл for в bash для прокрутки списков.