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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top