Rechercher : dans
Par :

[Shell Unix] Variable qui ne se redefinie pas

Dernière réponse le 25 mai 2009 à 20:40:06 Rafael89, le 24 mai 2009 à 19:29:52 
 Signaler ce message aux modérateurs

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"
Configuration: Linux Mandriva
Firefox 3.0.10

Meilleures réponses pour « [Shell Unix] Variable qui ne se redefinie pas » dans :
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Sed - Introduction à SED - Part II VoirSED - The Stream EDitor - Part II Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Télécharger CygWin VoirCygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de fournir une couche d'émulation Unix pour le système Windows d'un ensemble de librairies, sources et exécutables adaptés à Cygwin...
Variables d'environnement VoirVariables d'environnement Une variable d'environnement est une valeur dynamique, chargée en mémoire, pouvant être utilisée par plusieurs processus fonctionnant simultanément. Sur la plupart des systèmes d'exploitation, les emplacement de...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
Commandes UNIX VoirTableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...

1

dubcek, le 25 mai 2009 à 09:03:24

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

Répondre à dubcek

2

 Rafael89, le 25 mai 2009 à 20:40:06

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é

Répondre à Rafael89