Wie Schreibe ich eine for-Schleife in bash
Frage
Ich bin auf der Suche für die basic-Schleife wie:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
aber für die bash.
Lösung
Von diese Seite:
for i in $(seq 1 10);
do
echo $i
done
Andere Tipps
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
Die bash for
besteht aus einer Variablen (der iterator) und eine Liste von Wörtern, wo der iterator wird, gut, Durchlaufen.
Also, wenn Sie eine begrenzte Liste von Wörtern, nur setzen Sie Sie in die folgende syntax:
for w in word1 word2 word3
do
doSomething($w)
done
Wahrscheinlich möchten Sie iterieren über einige der zahlen, so dass Sie verwenden können die seq
Befehl zum erstellen einer Liste von Nummern für Sie:(von 1 bis 100 zum Beispiel)
seq 1 100
und verwenden Sie es in der FOR-Schleife:
for n in $(seq 1 100)
do
doSomething($n)
done
Beachten Sie die $(...)
syntax.Es ist eine bash-Verhalten, ermöglicht es Ihnen, übergeben Sie die Ausgabe eines Befehls ist (in unserem Fall aus seq
) zu einer anderen (den for
)
Das ist wirklich hilfreich wenn Sie haben zu iterieren über alle Verzeichnisse in manchen Pfad, zum Beispiel:
for d in $(find $somepath -type d)
do
doSomething($d)
done
Die Möglichkeiten sind unendlich, die zum generieren der Listen.
Bash 3.0+ können diese syntax verwenden:
for i in {1..10} ; do ... ; done
..was verhindert, dass das laichen in einem externen Programm zu erweitern der Sequenz (wie seq 1 10
).
Natürlich hat das gleiche problem wie die for(())
Lösung, gebunden zu bash und sogar eine bestimmte version (ob diese Fragen auf Sie zu.)
Versuchen Sie, die bash
built-in Hilfe:
$ 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.
Ich im Allgemeinen, wie zu verwenden, eine leichte Variante des standard-for-Schleife.Ich benutze oft diese zum ausführen eines Befehls auf eine Reihe von remote-hosts.Ich nutze bash-s brace expansion zu schaffen, for-Schleifen, die mir erlauben, zu erstellen, die nicht-numerische for-Schleifen.
Beispiel:
Ich will laufen, die uptime-Befehl auf den frontend-Rechnern 1-5 und backend-hosts 1-3:
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
Ich in der Regel laufen diese als single-line-Befehl mit dem Semikolon an den enden der Linien statt der besser lesbaren version oben.Der Schlüssel Verwendung berücksichtigt werden, dass die Klammern erlauben die Angabe mehrerer Werte eingefügt werden, in eine Zeichenkette (z.B.pre{foo,bar}post-Ergebnisse in prefoopost, prebarpost) und ermöglichen das zählen/Sequenzen durch die Verwendung der Doppel-Zeiten (die Sie verwenden können, a..z, etc.).Jedoch, die doppelte Zeit-syntax ist eine neue Funktion von bash 3.0;frühere Versionen werden nicht unterstützt.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
Hier ist ein Beispiel, dass kann auch bei älteren shells, während Sie weiterhin die effiziente für große zählt:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
Aber viel Glück dabei nützlich Dinge in awk
: Wie setze ich shell-Variablen in einem awk-Skript?
wenn Sie intereased nur in der bash, die "for(( ...)) "- Lösung, die oben dargestellt ist die beste, aber wenn Sie wollen etwas, das POSIX-SH-kompatibel, die auf allen UNIX-artigen Systemen müssen Sie "Ausdruck" und "während", und das ist, weil "(())" oder "seq" oder "i=i+1" sind nicht portabel zwischen verschiedenen shells
Ich benutze Variationen dieser die ganze Zeit, um Dateien zu verarbeiten...
für Dateien im *.log;do echo "Dinge zu Tun mit:$files";echo "Tun Sie mehr Dinge mit:$files";done;
Wenn die Verarbeitung Listen von Dateien, was Sie interessiert sind, schauen Sie in die -execdir option für Dateien.