Стоит отметить, что указанный здесь диапазон является включительным . Под этим я подразумеваю, что вы увидите весь диапазон (от 1 до 10), напечатанный на консоли.
Хороший ответ, но вы можете включить for ((i = 0; i <MAX; i ++)); doSomething ($ i); вариант тоже готов. Я думаю, что это обычно предпочтительнее для варианта for i in $ (seq 0 MAX), поскольку последний сначала сгенерирует все числа от 0 до MAX перед фактическим выполнением цикла.
mweerden
30
Bash 3.0+ может использовать этот синтаксис:
for i in{1..10};do...;done
.. что позволяет избежать создания внешней программы для расширения последовательности (например, seq 1 10 ).
Конечно, это та же проблема, что и for(())решение, привязка к bash и даже к конкретной версии (если это важно для вас).
$ help forfor:for NAME [in WORDS ...;]do COMMANDS;doneThe`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;doneEquivalent 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.
Раньше я этого не замечал, но похожий синтаксис показан в одном из предыдущих ответов. Уникальным здесь является использование фигурных скобок вместо типичной пары do/ done.
Brent Bradburn
4
Обычно мне нравится использовать небольшой вариант стандартного цикла for. Я часто использую это для запуска команды на нескольких удаленных хостах. Я использую расширение скобок в bash для создания циклов for, которые позволяют мне создавать нечисловые циклы for.
Пример:
Я хочу запустить команду uptime на интерфейсных хостах 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
Я не верю, что вы получите пустую переменную $ host. Это потому, что в приведенном выше примере используется раскрытие фигурных скобок. Цикл for явно устанавливает для переменной $ host значения: frontend1.mycompany.com frontend2.mycompany.com. . backend1.mycompany.com Но если вы видите способ получить нулевое значение; Мне было бы интересно узнать. Вы могли бы выполнить ssh внутри условного теста, если бы это было проблемой.
terson
1
если вас интересует только bash, решение "for ((...))", представленное выше, является лучшим, но если вы хотите что-то совместимое с POSIX SH, которое будет работать на всех устройствах, вам придется использовать expr и "while", и это потому, что "(())" или "seq" или "i = i + 1" не переносимы между различными оболочками
Ответы:
С этого сайта :
источник
источник
ArrayLength=${#array[@]}
как мы используем ее здесь вместоmax
?Bash
for
состоит из переменной (итератора) и списка слов, по которым итератор будет выполнять итерацию.Итак, если у вас ограниченный список слов, просто введите их в следующем синтаксисе:
Вероятно, вы хотите перебрать некоторые числа, поэтому вы можете использовать
seq
команду для создания списка чисел для вас: (например, от 1 до 100)и используйте его в цикле FOR:
Обратите внимание на
$(...)
синтаксис. Это поведение bash, оно позволяет передавать вывод одной команды (в нашем случае отseq
) к другой (командеfor
)Это действительно полезно, когда вам нужно перебрать все каталоги по некоторому пути, например:
Возможности создания списков безграничны.
источник
Bash 3.0+ может использовать этот синтаксис:
.. что позволяет избежать создания внешней программы для расширения последовательности (например,
seq 1 10
).Конечно, это та же проблема, что и
for(())
решение, привязка к bash и даже к конкретной версии (если это важно для вас).источник
Попробуйте
bash
встроенную справку:источник
Вот пример, который также может работать в старых оболочках, но при этом эффективен для больших количеств:
Но удачи в выполнении полезных вещей внутри
awk
: Как использовать переменные оболочки в сценарии awk?источник
do
/done
.Обычно мне нравится использовать небольшой вариант стандартного цикла for. Я часто использую это для запуска команды на нескольких удаленных хостах. Я использую расширение скобок в bash для создания циклов for, которые позволяют мне создавать нечисловые циклы for.
Пример:
Я хочу запустить команду uptime на интерфейсных хостах 1-5 и внутренних хостах 1-3:
Я обычно запускаю это как однострочную команду с точками с запятой на концах строк вместо более удобочитаемой версии выше. Ключевое соображение использования заключается в том, что фигурные скобки позволяют вам указать несколько значений, которые будут вставлены в строку (например, результаты pre {foo, bar} post в prefoopost, prebarpost) и позволяют подсчет / последовательности с использованием двойных точек (вы можете использовать. .z и т. д.). Однако синтаксис с двойной точкой - это новая функция bash 3.0; более ранние версии не поддерживают это.
источник
если вас интересует только bash, решение "for ((...))", представленное выше, является лучшим, но если вы хотите что-то совместимое с POSIX SH, которое будет работать на всех устройствах, вам придется использовать expr и "while", и это потому, что "(())" или "seq" или "i = i + 1" не переносимы между различными оболочками
источник
Я все время использую его вариации для обработки файлов ...
Если вас интересует обработка списков файлов, загляните в изучите параметр -execdir для файлов .
источник