[Shell Unix] Variable qui ne se redefinie pas

Résolu/Fermé
Rafael89 - 24 mai 2009 à 19:29
 Rafael89 - 25 mai 2009 à 20:40
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

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
25 mai 2009 à 09:03
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
0
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é
0