




От этот сайт:
for i in $(seq 1 10);
do
echo $i
done
Стоит отметить, что здесь указан диапазон инклюзивный. Под этим я подразумеваю, что вы увидите весь диапазон (от 1 до 10), напечатанный на консоли.
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
если у нас есть такая переменная, как ArrayLength=${#array[@]}, как мы можем использовать ее здесь вместо max?
Попробуйте встроенную справку 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, прежде чем фактически выполнить цикл.
Я все время использую его вариации для обработки файлов ...
for files in *.log; do echo "Do stuff with: $files"; echo "Do more stuff with: $files"; done;
Если вас интересует обработка списков файлов, изучите параметр -execdir для файлы.
Я думаю, вы имеете в виду параметр -execdir для поиска
если вас интересует только 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», если вы хотите его прочитать.
Я не верю, что вы получите пустую переменную $ host. Это связано с тем, что в приведенном выше примере используется расширение скобок. Цикл for явно устанавливает для переменной $ host значения: frontend1.mycompany.com frontend2.mycompany.com. . backend1.mycompany.com Но если вы видите способ, чтобы он имел нулевое значение; Мне было бы интересно узнать. Вы могли бы выполнить ssh внутри условного теста, если бы это было проблемой.
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.
возможный дубликат Как мне перебрать диапазон чисел, определяемый переменными в bash?