Как мне написать цикл для Bash

bash iterator

87957 просмотра

9 ответа

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

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

но для баш.

Автор: John Meagher Источник Размещён: 17.05.2019 03:08

Ответы (9)


85 плюса

Решение

С этого сайта :

for i in $(seq 1 10);
do
    echo $i
done
Автор: Rob Rolnick Размещён: 08.09.2008 03:11

58 плюса

for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
Автор: Nick Stinemates Размещён: 08.09.2008 03:13

33 плюса

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

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

Автор: Fernando Barrocal Размещён: 08.09.2008 03:26

25 плюса

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

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

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

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

Автор: David Gardner Размещён: 22.07.2010 10:38

13 плюса

Попробуйте 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.


Автор: Pat Notz Размещён: 08.09.2008 03:14

4 плюса

Я обычно люблю использовать небольшой вариант стандарта для цикла. Я часто использую это для запуска команды на нескольких удаленных хостах. Я использую расширение скобок 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} публикует результаты в prefoopost, prebarpost) и разрешают подсчет / последовательность с использованием двойных периодов (вы можете использовать a. .z и т. д.). Тем не менее, синтаксис с двойным периодом является новой функцией bash 3.0; более ранние версии не будут поддерживать это.

Автор: terson Размещён: 27.09.2008 10:31

4 плюса

#! /bin/bash

function do_something {
   echo value=${1}
}

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?

Автор: nobar Размещён: 31.12.2012 06:49

1 плюс

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

Автор: dandu Размещён: 16.09.2008 10:32

0 плюса

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

для файлов в * .log; do echo "Делать вещи с: $ files"; echo "Делать больше с: $ files"; сделанный;

Если вам интересна обработка списков файлов, посмотрите опцию -execdir для файлов .

Автор: PileOfMush Размещён: 08.09.2008 04:53
Вопросы из категории :
32x32