[Shell Unix] Variable qui ne se redefinie pas

[Résolu/Fermé]
Signaler
-
 Rafael89 -
Bonjour,

Je deviens fou avec mon problème. Ce doit être gros comme une maison, mais impossible de trouver. J'ai déjà trouvé beaucoups de réponses sur ce forum, alors si quelqu'un peu m'aider ...

Contexte :
Dans un script shell sous Linux, avant de copier des fichiers, je vérifie que ces fichiers ne sont pas déjà présent dans le répertoire de destination. Je fais une simple double boucle (pas très original, je sais). Pour chaque fichier de mon répertoire de destination, je fais une boucle dans mon repertoir d'origine et je redéfini une variable BOUBLONS à "o" si deux fichiers sont identiques.

Problème :
La variable DOUBLONS ne passe jamais à "o". L'affichage indique toujours "n".
La ligne echo "Fichier déjà sur le disque USB : $FICHIER" fonctionne bien.
Si je redefinie DOUBLONS après la boucle, cela fonctionne.

Mon code :
DOUBLONS="n"

find "$targetDir/$backupDir$DATE" -type f | 
while read A ; do
  	FICHIER=${A##*\/}

	find . -type f |
	while read B ; do
		FICHIER2=${B##*\/}
		if [ "$FICHIER" == "$FICHIER2" ]; then
			echo "Fichier déjà sur le disque USB : $FICHIER"
			DOUBLONS="o"
		fi	
	done	

done

echo "DOUBLONS = $DOUBLONS"

2 réponses

Messages postés
18246
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
21 juillet 2021
5 331
hello
parce que DOUBLONS est modifiée dans une tâche enfant à cause du find ...| et donc n'est pas modifiée dans la tâche appellante.

x=1
find . -ls | while read fichier ; do
      x=2
done
echo $x

x vaut toujours 1
par contre
x=1
find . -ls | (while read fichier ; do
      x=2
done
echo $x)

x vaut 2
Merci bubcek,

J'ai compris. C'est un problème de persistance des variables. Je début en script shell, je suis plus habitué au C++.

Dans mon cas, comme j'ai deux boucles inbriquées avec chacune un pipe, ça ne fonctionne pas. Mais connaissant le problème, je peu rechercher sur le web d'autres solutions.

Merci pour ta rapidité