Question

Je recherche la boucle de base comme :

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

mais pour bash.

Était-ce utile?

La solution

Depuis ce site:

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

Autres conseils

for ((i = 0 ; i < max ; i++ )); do echo "$i"; done

La fête for consiste en une variable (l'itérateur) et une liste de mots où l'itérateur va, eh bien, itérer.

Donc, si vous avez une liste limitée de mots, mettez-les simplement dans la syntaxe suivante :

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

Vous souhaitez probablement parcourir certains nombres, vous pouvez donc utiliser le seq commande pour générer une liste de nombres pour vous :(de 1 à 100 par exemple)

seq 1 100

et utilisez-le dans la boucle FOR :

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

Noter la $(...) syntaxe.C'est un comportement bash, il vous permet de transmettre le résultat d'une commande (dans notre cas depuis seq) à un autre (le for)

Ceci est vraiment utile lorsque vous devez parcourir tous les répertoires d'un chemin, par exemple :

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

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

Frapper 3.0+ peut utiliser cette syntaxe :

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

..ce qui évite de générer un programme externe pour étendre la séquence (comme seq 1 10).

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

Essaie le bash aide intégrée :


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


J'aime généralement utiliser une légère variante de la boucle for standard.Je l'utilise souvent pour exécuter une commande sur une série d'hôtes distants.Je profite de l'expansion des accolades de bash pour créer des boucles for qui me permettent de créer des boucles for non numériques.

Exemple:

Je souhaite exécuter la commande uptime sur les hôtes frontend 1 à 5 et les hôtes backend 1 à 3 :

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

Je l'exécute généralement sous la forme d'une commande sur une seule ligne avec des points-virgules aux extrémités des lignes au lieu de la version plus lisible ci-dessus.La principale considération d'utilisation est que les accolades vous permettent de spécifier plusieurs valeurs à insérer dans une chaîne (par ex.pre{foo,bar}post donne prefoopost, prebarpost) et autorise les comptages/séquences en utilisant les doubles points (vous pouvez utiliser a..z etc.).Cependant, la syntaxe à double point est une nouvelle fonctionnalité de bash 3.0 ;les versions antérieures ne le prendront pas en charge.

#! /bin/bash

function do_something {
   echo value=${1}
}

MAX=4
for (( i=0; i<MAX; i++ )) ; {
   do_something ${i}
}

Voici un exemple qui peut également fonctionner avec des shells plus anciens, tout en restant efficace pour les grands nombres :

Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'

Mais bonne chance pour faire des choses utiles à l'intérieur awk: Comment utiliser les variables shell dans un script awk ?

si vous n'êtes intéressé que par bash, le "for(( ...))" la solution présentée ci-dessus est la meilleure, mais si vous voulez quelque chose de compatible avec POSIX SH qui fonctionnera sur tous les systèmes, vous devrez utiliser "expr" et "while", et c'est parce que "(())" ou "seq " ou "i=i+1" ne sont pas portables entre différents shells

J'en utilise tout le temps des variantes pour traiter des fichiers...

pour les fichiers en *.log ;do echo "Faire des trucs avec :$fichiers";echo "Faites plus de choses avec :$fichiers";fait;

Si le traitement de listes de fichiers vous intéresse, consultez le -execdir option pour des dossiers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top