Как написать цикл for в bash

Я ищу базовый цикл вроде:

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}

но для bash.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
96
1
105 257
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

От этот сайт:

for i in $(seq 1 10);
do
    echo $i
done

Стоит отметить, что здесь указан диапазон инклюзивный. Под этим я подразумеваю, что вы увидите весь диапазон (от 1 до 10), напечатанный на консоли.

Jamie 23.02.2016 01:28

for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

если у нас есть такая переменная, как ArrayLength=${#array[@]}, как мы можем использовать ее здесь вместо max?

Kasun Siyambalapitiya 02.12.2016 13:44

Попробуйте встроенную справку bash:


$ help for

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.


Bash for состоит из переменной (итератора) и списка слов, в которых итератор будет выполнять итерацию.

Итак, если у вас ограниченный список слов, просто введите их в следующем синтаксисе:

for w in word1 word2 word3
do
  doSomething($w)
done

Вероятно, вы хотите перебрать некоторые числа, поэтому вы можете использовать команду seq, чтобы сгенерировать для вас список чисел: (например, от 1 до 100)

seq 1 100

и используйте его в цикле FOR:

for n in $(seq 1 100)
do
  doSomething($n)
done

Обратите внимание на синтаксис $(...). Это поведение bash, оно позволяет передавать вывод одной команды (в нашем случае из seq) в другую (for).

Это действительно полезно, когда вам нужно перебрать все каталоги по некоторому пути, например:

for d in $(find $somepath -type d)
do
  doSomething($d)
done

Возможности создания списков безграничны.

Хороший ответ, но вы можете включить for ((i = 0; i <MAX; i ++)); doSomething ($ i); вариант тоже готов. Я думаю, что это обычно предпочтительнее для варианта for i in $ (seq 0 MAX), поскольку последний сначала сгенерирует все числа от 0 до MAX, прежде чем фактически выполнить цикл.

mweerden 08.09.2008 10:43

Я все время использую его вариации для обработки файлов ...

for files in *.log; do echo "Do stuff with: $files"; echo "Do more stuff with: $files"; done;

Если вас интересует обработка списков файлов, изучите параметр -execdir для файлы.

Я думаю, вы имеете в виду параметр -execdir для поиска

Dennis Williamson 18.04.2009 02:13

если вас интересует только bash, решение "for ((...))", представленное выше, является лучшим, но если вы хотите что-то совместимое с POSIX SH, которое будет работать на всех устройствах, вам придется использовать expr и "while", и это потому, что "(())" или "seq" или "i = i + 1" не переносимы между различными оболочками

Обычно мне нравится использовать небольшой вариант стандартного цикла for. Я часто использую это для запуска команды на нескольких удаленных хостах. Я использую расширение скобок в bash для создания циклов for, которые позволяют мне создавать нечисловые циклы for.

Пример:

Я хочу запустить команду безотказной работы на интерфейсных хостах 1-5 и внутренних хостах 1-3:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

Я обычно запускаю это как однострочную команду с точками с запятой на концах строк вместо более удобочитаемой версии выше. Ключевое соображение использования заключается в том, что фигурные скобки позволяют вам указать несколько значений, которые будут вставлены в строку (например, результаты pre {foo, bar} post в prefoopost, prebarpost) и позволяют подсчет / последовательности с использованием двойных точек (вы можете использовать. .z и т. д.). Однако синтаксис с двойной точкой - это новая функция bash 3.0; более ранние версии не поддерживают это.

В связи с этим, что, если $ host var по какой-то причине оказалась пустой строкой? Он все равно запустит ssh. Итак, как мне этого избежать? В моем случае я делаю что-то другое, и ваш ответ мне поможет. Я пытаюсь проверить Gmail на наличие новых сообщений и, если они найдены, отправить SMS с отправителем и темой. Мой вопрос помечен как «Соединение двух команд Bash», если вы хотите его прочитать.

Volomike 26.10.2009 01:07

Я не верю, что вы получите пустую переменную $ host. Это связано с тем, что в приведенном выше примере используется расширение скобок. Цикл for явно устанавливает для переменной $ host значения: frontend1.mycompany.com frontend2.mycompany.com. . backend1.mycompany.com Но если вы видите способ, чтобы он имел нулевое значение; Мне было бы интересно узнать. Вы могли бы выполнить ssh внутри условного теста, если бы это было проблемой.

terson 08.11.2009 22:07

Bash 3.0+ может использовать этот синтаксис:

for i in {1..10} ; do ... ; done

..который позволяет избежать создания внешней программы для расширения последовательности (например, seq 1 10).

Конечно, здесь та же проблема, что и у решения for(()), поскольку оно связано с bash и даже с конкретной версией (если это важно для вас).

#! /bin/bash

function do_something {
   echo value=
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}

Вот пример, который также может работать в старых оболочках, но при этом эффективен для больших количеств:

Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'

Но удачи в выполнении полезных вещей внутри awk: Как использовать переменные оболочки в сценарии awk?

Раньше я этого не замечал, но похожий синтаксис показан в одном из предыдущих ответов. Уникальным здесь является использование фигурных скобок вместо типичной пары do / done.

Brent Bradburn 21.06.2013 19:48

Другие вопросы по теме