Neenou a écrit :
La boucle for ne doit pas être très compliquée mais connaissant bien le langage C,C++ .. j'ai du mal à me faire à la syntaxe de cette boucle for
|
Le principe de la boucle for est de pouvoir traiter un à un une liste d'élément
Code :
- for var in hello titi toto
- do
- echo "Element [$var]"
- done
|
Va instancier une boucle de 3 itérations et à chaque itération, la variable "var" prendra la valeur "hello", "titi" et "toto".
S'il n'y avait que ça, la boucle for n'apporterait que très peu d'avantage. Mais le shell possède d'autres outils et l'un des plus fameux est la délégation => il délègue aux programmes annexes ce qu'il ne sait pas faire lui-même.
Le principe: il est nécessaire que le programme
- existe (mais on peut le créer s'il n'existe pas)
- affiche son résultat à l'écran
Exemple: expr 5 + 1 => affiche le résultat (6) à l'écran
A partir de là, le shell, s'il ne sait pas faire de calcul (comme le Bourne Shell) peut déléguer ce travail à expr. Il lui suffit de mettre l'appel de expr entre backquotes et tout ce que expr affiche sera récupéré ensuite.
Donc, si on veut faire un calcul et récupérer le résultat, on écrit
Code :
- var=`expr 5 + 1` => Le shell fera comme s'il était écrit var=6
|
ou bien
Code :
- var=12
- var=`expr $var + 1` => Le shell fera comme s'il était écrit var=13
|
Et ce mécanisme (qui n'existe nulle part ailleurs, même pas en C++) permet de tout faire. Si le shell ne sait pas faire une action, ben il délègue l'action à un outil externe et si l'outil n'existe pas ben on le crée (en C++ par exemple). Seule contrainte => l'outil doit afficher son résultat à l'écran
Les backquotes étant parfois désagréables, les shells évolués ont introduit une nouvelle notation: $(commande) et donc l'exemple précédent peut de réécrire
Code :
- var=12
- var=$(expr $var + 1) => Le shell fera comme s'il était écrit var=13
|
Et donc il est maintenant possible d'associer la boucle for avec ce mécanisme en écrivant
Code :
- for var in $(commande quelconque)
- do
- ...
- done
|
Le shell commencera par exécuter "commande quelconque" et replacera tout ce qu'elle affiche à la place. Cela donnera donc une boucle de ce style
Code :
- for var in <toute une liste de mots affichés par la commande>
- do
- ...
- done
|
Et donc chaque mot pourra être traité. C'est ce qui amène à la soluce d'Elmoricq
Code :
- for affaire in $(find /offres/* -type d -prune)
- do
- ....
- done
|
La commande "find /offres..." renvoie toute une liste de fichiers et cette liste est ensuite traitée fichier par fichier dans la boucle.
Comme quoi, d'une simple boucle for...
Message édité par Sve@r le 22-08-2008 à 20:59:05
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.