Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие.
В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В Bash доступны три основные конструкции цикла: for
, while
и until
циклы.
В этом руководстве мы рассмотрим основы циклов for в Bash. Мы также покажем вам, как использовать операторы break
и continue
чтобы изменить ход цикла.
Содержание
Стандартный for
цикл в Bash
Цикл 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}
Вот пример, показывающий, как увеличить на 5:
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
Цикл for в Bash в стиле C
Синтаксис цикла for
стиле C имеет следующий вид:
for ((INITIALIZATION; TEST; STEP))
do
[COMMANDS]
done
Часть INITIALIZATION
выполняется только один раз при запуске цикла. Затем оценивается TEST
. Если это ложь, цикл прекращается. Если 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
Оператор 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
Оператор 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
Примеров циклов for в Bash
Переименование файлов с пробелами в имени файла
В следующем примере показано, как переименовать все файлы в текущем каталоге с пробелом в его именах, заменив пробел на подчеркивание:
for file in * *; do
mv "$file" "${file// /_}"
done
Давайте разберем код построчно:
- Первая строка создает цикл
for
и выполняет итерацию по списку всех файлов с пробелом в имени. Выражение* *
создает список. - Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя пробел знаком подчеркивания (
_
). Часть${file// /_}
использует расширение параметра оболочки для замены шаблона в параметре строкой. done
указывает конец сегмента цикла.
Изменение расширения файла
В следующем примере показано, как использовать цикл for
в 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 используется для повторного выполнения заданного набора команд определенное количество раз.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Здравствуйте,а не подскажите что выполняет данный цикл?
#!/bin/bash
for i in {2000..2017}
do
for j in {00..12}
do
mv $i$j*jpg $i/$j
done
done
перетаскивает и переименовывает файлы