- How do I write a ‘for’ loop in Bash?
- Output
- for цикл в Bash
- Стандартный for цикл в Bash
- Оберните струны
- Цикл по диапазону чисел
- Перебирать элементы массива
- Цикл for в Bash в стиле C
- Операторы break и continue
- Оператор break
- Оператор continue
- Примеров циклов for в Bash
- Переименование файлов с пробелами в имени файла
- Изменение расширения файла
- Выводы
How do I write a ‘for’ loop in Bash?
It’s worth a mention that the range specified here is inclusive. By that, I mean you will see the entire range (1 to 10) printed to the console.
I prefer this solution since it does not use a seq so it does not generate a weird string containing a sequence of all the numbers, but it just loops efficiently over an integer.
The Bash for consists on a variable (the iterator) and a list of words where the iterator will, well, iterate.
So, if you have a limited list of words, just put them in the following syntax:
for w in word1 word2 word3 do doSomething($w) done
Probably you want to iterate along some numbers, so you can use the seq command to generate a list of numbers for you: (from 1 to 100 for example)
and use it in the for loop:
for n in $(seq 1 100) do doSomething($n) done
Note the $(. ) syntax. It’s a Bash behaviour, and it allows you to pass the output from one command (in our case from seq ) to another (the for ).
This is really useful when you have to iterate over all directories in some path, for example:
for d in $(find $somepath -type d) do doSomething($d) done
The possibilities are infinite to generate the lists.
Good answer, but you might want to include the for ((i=0; i
Bash 3.0+ can use this syntax:
. which avoids spawning an external program to expand the sequence (such as seq 1 10 ).
Of course, this has the same problem as the for(()) solution, being tied to Bash and even a particular version (if this matters to you).
Try the Bash built-in help:
Output
for: for NAME [in WORDS . ;] do COMMANDS; done The `for' loop executes a sequence of commands for each member in a list of items. If `in WORDS . ;' is not present, then `in "$@"' is assumed. For each element in WORDS, NAME is set to that element, and the COMMANDS are executed. for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done Equivalent to (( EXP1 )) while (( EXP2 )); do COMMANDS (( EXP3 )) done EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is omitted, it behaves as if it evaluates to 1.
#! /bin/bash function do_something < echo value=$> MAX=4 for (( i=0; i >
Here’s an example that can also work in older shells, while still being efficient for large counts:
But good luck doing useful things inside of awk : How do I use shell variables in an awk script?
I didn’t notice it before, but a similar syntax is shown in one of the earlier answers. The unique thing here is the use of curly-braces instead of the typical do / done pair.
I commonly like to use a slight variant on the standard for loop. I often use this to run a command on a series of remote hosts. I take advantage of Bash’s brace expansion to create for loops that allow me to create non-numerical for loops.
I want to run the uptime command on frontend hosts 1-5 and backend hosts 1-3:
% for host in ,backend>.mycompany.com do ssh $host "echo -n $host; uptime" done
I typically run this as a single-line command with semicolons on the ends of the lines instead of the more readable version above. The key usage consideration are that braces allow you to specify multiple values to be inserted into a string (e.g. prepost results in prefoopost, prebarpost) and allow counting/sequences by using the double periods (you can use a..z, etc.). However, the double period syntax is a new feature of Bash 3.0; earlier versions will not support this.
for цикл в Bash
Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие.
В языках сценариев, таких как 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
Цикл по диапазону чисел
Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:
Вот пример цикла, который перебирает все числа от 0 до 3:
for i in 0..3> do echo "Number: $i" done
Number: 0 Number: 1 Number: 2 Number: 3
Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:
Вот пример, показывающий, как увеличить на 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 и выполняет итерацию по списку всех файлов с пробелом в имени. Выражение * * создает список.
- Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя пробел знаком подчеркивания ( _ ). Часть $ использует расширение параметра оболочки для замены шаблона в параметре строкой.
- done указывает конец сегмента цикла.
Изменение расширения файла
В следующем примере показано, как использовать цикл for в Bash for переименования всех файлов, оканчивающихся на .jpeg, в текущем каталоге путем замены расширения файла с .jpeg на .jpg.
for file in *.jpeg; do mv -- "$file" "$file%.jpeg>.jpg" done
Давайте проанализируем код построчно:
- Первая строка создает цикл for и выполняет итерацию по списку всех файлов, заканчивающихся на ‘.jpeg’.
- Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя «.jpeg» на «.jpg». $ чтобы удалить часть ‘.jpeg’ из имени файла, используя расширение параметра оболочки
- done указывает конец сегмента цикла.
Выводы
Цикл for Bash используется для повторного выполнения заданного набора команд определенное количество раз.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.