Jak napisać pętlę for w bash
Szukam podstawowej pętli typu:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
Ale dla Basha. 9 answers
From this site :
for i in $(seq 1 10);
do
echo $i
done
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
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.
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).
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.
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ć.
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}
}
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
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.