104 votes

Comment écrire une boucle for en bash

Je cherche la boucle de base comme:

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

mais pour bash.

115voto

Rob Rolnick Points 4075

Voir: ce site

     for i in $(seq 1 10);
    do
            echo $i
    done
 

65voto

Nick Stinemates Points 5642
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

37voto

Fernando Barrocal Points 3878

Le bash for se compose d'une variable (la variable d'itération) et une liste de mots où l'itérateur va, bien, itérer.

Donc, si vous avez une liste limitée de mots, il suffit de les placer dans la syntaxe suivante:

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

Probablement vous souhaitez effectuer une itération sur certains numéros, vous pouvez utiliser l' seq commande pour générer une liste de nombres pour vous: (de 1 à 100 par exemple)

seq 1 100

et de l'utiliser dans la boucle FOR:

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

Remarque l' $(...) de la syntaxe. C'est un bash comportement, il vous permet de passer la sortie d'une commande (dans notre cas, à partir d' seq) à l'autre ( for)

C'est vraiment utile lorsque vous devez effectuer une itération sur tous les répertoires dans le chemin, par exemple:

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

Les possibilités sont infinies pour générer des listes.

32voto

David Gardner Points 2259

Bash 3.0+ peut utiliser cette syntaxe:

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

..qui évite de générer un programme externe pour développer la séquence (tel que seq 1 10 ).

Bien sûr, cela pose le même problème que la solution for(()) , liée à bash et même à une version particulière (si cela vous importe).

14voto

Pat Notz Points 46841

Essayez l'aide intégrée 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.


 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X