Boucle récursive dans une fonction qui stoppe

Fermé
Pouzy - 24 mai 2008 à 11:00
 Pouzy - 25 mai 2008 à 16:43
Bonjour tout le monde !

J'ai un petit souci sur une fonction bash, dont voici un condensé, je n'ai gardé que la partie qui nous intéresse :

fonction machin()
{
nbA=`ls -al $1 | wc -l`
nbB=`ls -al $2 | wc -l`
local -i i=4; #Je le mets à 4 pour ne pas avoir . .. et la ligne de total

while [ $i -le $nbA ]
do
    local -i i2=4;
    while [ $i2 -le $nbB ]
    do
        i2=`expr $i2 + 1`

			if [ $nomA == $nomB ]      				#même NOM
			then 		
					if [ $typeA == "d" -a $typeB == "d" ]   #DOSSIER tout les 2
					then 
						echo "Cool, récursion (deux dossiers, on entre dedans)";
						#Récursivement on utilise la fonction avec les bons dossiers
						#On appelle la fonction avec les dossiers en question
						ecrirejournal $1/$nomA $2/$nomB;
						break;
					fi
			else 							#pas même NOM
				echo "On continue la boucle 2";  
 			
			fi

		#Incrémentation de i2			  	
		i2=`expr $i2 + 1`
	done	#On sort de la boucle 2
	#On incrémente i
	i=`expr $i + 1`
done #fin boucle 1

echo "Fonction terminée !"
}


Vous allez voir l'intêret du "fonction terminée" : en fait, c'est pour voir s'il plante ou s'il continue la fonction. Et après la récursivité, on a deux fois de suite "Fonction terminée !". Ca veut dire que le script saute à la find e la fonction sans continuer de regarder les autres dossiers. Sûrement un problème lié aux i et i2, mais je les ai retourné dans tous les sens sans trouver.

J'ai peut être oublié quelques accolades ou trucs du genre ici, mais c'est pour le condensé.
Quelqu'un aurait-til une idée du pourquoi ? Voici un exemple d'utilisation :

boucle---------------------------------------------
nom DIR1: hoho (DOSSIER1)
nom DIR2 : gloubi (DOSSIER2)
On continue la boucle 2
i2 : 5
i : 7
nom DIR2 : gogo (DOSSIER2)
On continue la boucle 2
i2 : 6
i : 7
nom DIR2 : hoho (DOSSIER2)
Cool, récursion (deux dossiers, on entre dedans)
DOSSIER1/hoho DIR1
DOSSIER2/hoho DIR2
nbA = 6 nbB =6
boucle---------------------------------------------
nom DIR1: cxc (DOSSIER1/hoho)
nom DIR2 : cxc (DOSSIER2/hoho)
Même type
boucle---------------------------------------------
nom DIR1: gloubi (DOSSIER1/hoho)
nom DIR2 : cxc (DOSSIER2/hoho)
On continue la boucle 2
i2 : 5
i : 5
nom DIR2 : gloubi (DOSSIER2/hoho)
Même type
boucle---------------------------------------------
nom DIR1: test4 (DOSSIER1/hoho)
nom DIR2 : cxc (DOSSIER2/hoho)
On continue la boucle 2
i2 : 5
i : 6
nom DIR2 : gloubi (DOSSIER2/hoho)
On continue la boucle 2
i2 : 6
i : 6
nom DIR2 : test4 (DOSSIER2/hoho)
Même type
Fonction terminée !
Fonction terminée !



On voit qu'il entre dans /DOSSIERx/hoho, mais au lieu de continuer une fois que celui ci a été exploré, il s'arrête ! (deux fois "fonction terminée"). Je voudrais qu'il explore le dossier en entier parce qu'il reste des trucs non lus dans DOSSIER1 et DOSSIER2, et je bloque. (j'ai mis les i et i2 en echo pour faciliter)

En y regardant de plus près, je vois que la premiere boucle n'est faite qu'une seule fois en sortie ! Au niveau des fonctions terminées, j'ai ceci : J'ai simplement rajouté un echo "début boucle" avant le while de la premiere boucle, et un echo "fin boucle" après le done de la premiere boucle aussi (pour tout encadrer dans la fonction) et je me retrouve avec ceci : (Il y a trois fonctions terminées car j'ai créé un autre dossier dans lequel rentrer récursivement, c'est normal)

Fonction terminée !
i1 5  i2 5
fin boucle 1
Fonction terminée !
i1 6  i2 5
fin boucle 1
Fonction terminée !
i1 7  i2 5


On voit qu'il n'y a pas le echo "debut"... Alors qu'entre les deux echo, je n'ai qu'un while qui est bien fermé !
Peut être un problème au niveau du break qui vire une des boucles ? Je suis un peu perdu.

Merci !

2 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
24 mai 2008 à 13:32
Salut,

C'est très difficile (enfin pour moi) de décortiquer et de comprendre un script fait par un autre sans avoir toutes les données et le script dans sa totalité.
Il serait peut être judicieux de nous donner le contenu entier de ton script ainsi que l'arborescence sur laquelle tu t'appuies pour faire tes tests, et peut être nous expliquer la finalité du script, parce que pout moi c'est pas très clair...

Tu cherches à faire quoi au juste ? Comparer 2 répertoires ? Ou juste descendre dans l'arborescence ?

Tant que j'y suis,
ls -Al | wc -l
enlève les répertoires "." et ".." du décompte, "
ls -Al | sed '1d' | wc -l
enlève la 1ère ligne en sus des 2 répertoires...
3
Bonjour et merci de ta réponse !
En fait, le but est de regarder de façon récurisve si les dossiers contiennent les mêmes fichiers ou non, et déterminer des actions à faire sinon.

Exemple, une arborescence comme ça :

Code:

D1/
D1/test/pouet
D1/test/toto
D1/test1

D2/
D2/test/pouet


Doit sortir : "test 2 en trop dans D2" et "toto est en trop dans D1/test", et effectuer une action que je déterminerai par la suite.

Et le but est d'entrer récursivement dans les dossiers, donc en relancant la fonction pour D1/test
Ca marche jusque la, mais avec mon script actuel, le traitement s'arrête à test et ne regarde plus test1 : il termine le script sans faire la suite du dossier dans lequel il est entré récursivement.
Je me demande donc si c'est une question d'incrémentation des variables ? Comment peut il se faire que la fonction marche jusqu'à la premiere récursion et qu'elle tourne dans le vide après (la premiere boucle) ?

Merci !
0
Je précise que j'utilise bash !

Merci :)
0