9 ответов:
С этот сайт:
for i in $(seq 1 10); do echo $i done
Баш
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) к другому (thefor)это действительно полезно, когда вам нужно перебирать все каталоги по некоторому пути, например:
for d in $(find $somepath -type d) do doSomething($d) doneвозможности бесконечны для создания списков.
Баш 3.0+ используйте следующий синтаксис:
for i in {1..10} ; do ... ; done..что позволяет избежать появления внешней программы для расширения последовательности (например,
seq 1 10).конечно, это имеет ту же проблему, что и
for(())решение, привязанное к bash и даже к конкретной версии (если это имеет значение для вас).
попробовать
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.
Мне обычно нравится использовать небольшой вариант в стандартном цикле for. Я часто использую это для запуска команды на нескольких удаленных хостах. Я использую расширение скобки bash для создания циклов, которые позволяют мне создавать нечисловые циклы for.
пример:
Я хочу, чтобы выполнить команду безотказной работы на frontend и backend хозяева хозяева 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) и разрешить подсчет/последовательности с помощью двойных периодов (вы можете использовать a..z и др.). Однако синтаксис двойного периода является новой функцией bash 3.0; Более ранние версии не будут поддерживать это.
#! /bin/bash function do_something { echo value= } MAX=4 for (( i=0; i<MAX; i++ )) ; { do_something ${i} }
Если вы заинтересованы только в Баш " для(( ... )) "решение, представленное выше, является лучшим, но если вы хотите что-то совместимое с POSIX SH, которое будет работать на всех unices, вам придется использовать "expr" и "while", и это потому, что "(())" или "seq" или "i=i+1" не так переносимы среди различных оболочек
Я использую вариации этого все время на обработку файлов...
для файлы в *.войти; делать Эхо "делать вещи с: $файлы"; Эхо "делать больше вещей с: $файлы"; готово;
Если обработка списков файлов-это то, что вас интересует, смотрите в -execdir на файлы.
Comments