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



Я ищу основной цикл, как:



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


но для bash.

674   9  

9 ответов:

С этот сайт:

for i in $(seq 1 10);
do
    echo $i
done
for ((i = 0 ; i < max ; i++ )); 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) к другому (the for)

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

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

    Ничего не найдено.