Jak napisać pętlę for w bash

Szukam podstawowej pętli typu:

for(int i = 0; i < MAX; i++) {
  doSomething(i);
}
Ale dla Basha.
Author: Mike Deck, 2008-09-08

9 answers

From this site :

for i in $(seq 1 10);
do
    echo $i
done
 78
Author: Rob Rolnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 16:30:53
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
 57
Author: Nick Stinemates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-01 15:06:33

Bash for składa się ze zmiennej (iterator) i listy słów, w których iterator będzie, cóż, iterator.

Więc, jeśli masz ograniczoną listę słów, po prostu umieść je w następującej składni:

for w in word1 word2 word3
do
  doSomething($w)
done

Prawdopodobnie chcesz iterować wzdłuż niektórych liczb, więc możesz użyć polecenia seq, aby wygenerować listę liczb dla Ciebie: (na przykład od 1 do 100)

seq 1 100

I użyj go w pętli FOR:

for n in $(seq 1 100)
do
  doSomething($n)
done

Zwróć uwagę na składnię $(...). To zachowanie Basha, to pozwala na przekazanie wyjścia z jednego polecenia (w naszym przypadku z seq) do drugiego (for)

Jest to bardzo przydatne, gdy trzeba iterację nad wszystkimi katalogami w jakiejś ścieżce, na przykład:

for d in $(find $somepath -type d)
do
  doSomething($d)
done

Możliwości generowania list są nieskończone.

 33
Author: Fernando Barrocal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 03:26:16

Bash 3.0+ można użyć tej składni:

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

..co pozwala uniknąć wywołania zewnętrznego programu rozszerzającego sekwencję (np. seq 1 10).

Oczywiście, ma to ten sam problem co rozwiązanie for(()), jest powiązane z bashem, a nawet z konkretną wersją (jeśli ma to dla Ciebie znaczenie).

 23
Author: David Gardner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 10:38:56

Wypróbuj bash wbudowaną pomoc:


$ 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.


 13
Author: Pat Notz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 03:14:12

Zwykle lubię używać lekkiego wariantu w standardzie dla pętli. Często używam tego do uruchamiania polecenia na serii zdalnych hostów. Korzystam z rozszerzenia nawiasów Basha do tworzenia pętli for, które pozwalają mi tworzyć nie-numeryczne pętle for.

Przykład:

Chcę uruchomić polecenie uptime na frontend hostach 1-5 i backend hostach 1-3:

% for host in {frontend{1..5},backend{1..3}}.mycompany.com
    do ssh $host "echo -n $host; uptime"
  done

Zazwyczaj uruchamiam to jako polecenie jednoliniowe ze średnikami na końcach linii, zamiast bardziej czytelnego Wersja powyżej. Użycie klucza polega na tym, że klamry pozwalają określić wiele wartości, które mają być wstawione do łańcucha (np. Pre{foo,bar}post results in prefoopost, prebarpost) i zezwalają na liczenie / sekwencje za pomocą podwójnych okresów (możesz użyć a..z ITP.). Jednak składnia double period jest nową funkcją bash 3.0; wcześniejsze wersje nie będą tego wspierać.

 4
Author: terson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 10:31:58
#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}
 4
Author: nobar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 06:49:26

Jeśli interesujesz się tylko bashem to " for(( ... )) "rozwiązanie przedstawione powyżej jest najlepsze, ale jeśli chcesz mieć coś zgodnego z POSIX SH, które będzie działać na wszystkich unices musisz użyć" expr "I " while", a to dlatego, że "(())" lub "seq" lub "i=i+1" nie są tak przenośne wśród różnych powłok

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 22:32:38

Używam tego wariantu cały czas do przetwarzania plików...

Dla plików w *.log; do echo "do stuff with: $files"; echo "Do more stuff with: $files"; done;

Jeśli interesuje Cię przetwarzanie list plików, zajrzyj do opcji -execdir dla Plików.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-08 04:53:12