Предыдущий урок: bash скрипты для начинающих — урок №6: Цикл while.
В прошлый раз мы научились использовать цикл while. Но это не единственный вариант доступный нам в bash скриптах. Другой вид цикла — это цикл for. Его мы сегодня и будем изучать.
В чем отличие for от while?
Цикл for: Работает с заранее известным набором значений или диапазоном.
Цикл for: Обычно используется, когда нужно пройтись по списку элементов, файлам или числовому диапазону.
Цикл while: Работает, пока условие истинно.
Цикл while: Часто используется, когда точное число итераций заранее неизвестно, или нужно повторять по условию.
for больше подходит для перебора конкретных наборов данных или диапазонов.
while — для повторения до выполнения или невыполнения условия, чаще, когда число итераций заранее неизвестно.
Цикл for
Создадим новый файл и сделаем его исполняемым:
[root@waky bash_practice]# touch script_7.sh
[root@waky bash_practice]# chmod +x script_7.sh
[root@waky bash_practice]#
Шаг 1: Цикл по определенному множеству
Заполним файл script_7.sh следующим содержанием:
#!/bin/bash
echo "loop over range:"
for i in 1 2 3 4 5
do
echo "i: $i"
done
echo "loop over range, int:"
for i in {1..5}
do
echo "i: $i"
done
echo "loop over int range, step 2:"
for i in {1..5..2}
do
echo "i: $i"
done
echo "loop over range, str:"
for fruit in apple banana carambola
do
echo "fruit: $fruit"
done
Выполним скрипт и проанализируем вывод:
[root@waky bash_practice]# ./script_7.sh
loop over range:
i: 1
i: 2
i: 3
i: 4
i: 5
loop over range, int:
i: 1
i: 2
i: 3
i: 4
i: 5
loop over int range, step 2:
i: 1
i: 3
i: 5
loop over range, str:
fruit: apple
fruit: banana
fruit: carambola
[root@waky bash_practice]#
В первом и последнем цикле у нас задан весь диапазон значений, по которым должен пройти цикл. Не важно, что мы там указали, цифры, буквы или слова, для bash это все строки.
Во втором и третьем цикле мы даем понять, что это диапазон цифр, указывая первое и последнее значение. В третьем цикле мы еще указываем шаг, с которым цикл будет перебирать значения. По умолчанию, цикл идет с шагом 1, что видно во втором цикле, но можно поменять на любое целочисленное значение, как, например, 2 в третьем цикле.
Имя переменной, по которой идет итерирование можно указывать любое, но хорошей практикой является принцип давать этой переменной имя подчеркивающее, по каким элементам идет цикл.
Шаг 2: Цикл по результату команды
Часто бывает, что у нас нет готового списка элементов, по которому должен работать цикл. Например, список файлов в директории. Но мы можем легко получить этот список в процессе и передать циклу. Перепишем наш скрипт:
#!/bin/bash
for script_file in $(find ./ -type f -name "*.sh")
do
echo "file name: $script_file"
done
Команда find ./ -type f -name «*.sh» должна вернуть список файлов с .sh на конце находящихся в текущей директории. А цикл будет использовать названия файлов из этого списка. Проверим отработает ли скрипт, как задумано:
[root@waky bash_practice]# ./script_7.sh
file name: ./first_script.sh
file name: ./script_2.sh
file name: ./script_3.sh
file name: ./script_4.sh
file name: ./script_5.sh
file name: ./script_6.sh
file name: ./script_7.sh
[root@waky bash_practice]#
На каждом шаге цикла, скрипт имеет название отдельного файла, его можно использовать не только для банального вывода на экран, а для любых манипуляций с файлами: переименование, перемещение, копирование, удаление, сжатие и прочие.
Итоги:
Сегодня в нашем арсенале появился еще один мощный инструмент, имеющий широкое применение в bash скриптах. Цикл for помогает работать с заранее определенным множеством элементов или со множеством элементов, которое легко собрать вспомогательными командами.
Следующий урок: bash скрипты для начинающих — урок №8: цикл по строкам файла