Travail terminé, corrections

Je viens de voir qu’un nouveau topic avait été fait…
bref… du coup :

[quote]Je déterre un peu le sujet pour apporter un morceau de code un peu différent.
Plutôt que de checker /dev/sdxx ou le point de montage, je passe par l’uuid
Pourquoi ? amusez-vous à plugger un DD usb, le monter, le couper électriquement (cas d’une panne électrique), de le rallumer
il ne sera plus en /dev/sdc par exemple mais /dev/sdd
Chose qui me posait souci chez un client.
Avec l’uuid, ça passe bien mieux je trouve :slightly_smiling:

ça donne qlqch comme ça :

[code]
#remplacer par l’uuid correspondant au bon disque
DISK=“00000000-0000-0000-0000-000000000000”

MOUNTPOINT="/mnt"

if mount -U ${DISK} ${MOUNTPOINT} ; then
printf “$(date +%d-%m-%Y\ %Hh%M) - Montage du disque reussi.\n”

action

else
printf "$(date +%d-%m-%Y\ %Hh%M) - Echec de montage du disque.\n"
exit 0
fi[/code]
…et bien évidement on umount en fin de script

Si le disque est connecté et utilisable, alors on le monte dans MOUNTPOINT
Si cela échoue pour une quelconque raison que ce soit (partition invalide, disque non connecté, etc.), alors on arrête tout
Chez certains clients, j’ai même poussé le vice en rajoutant en cas d’échec l’écriture de la sortie d’un “ls -alh /dev/disk/by-uuid/” et d’un “blkid” dans un fichier log[/quote]

C’est en effet un plus.
Simple à modifier sur mon script :

remplacer les /dev/sdxy par l’UUID.
Je testerai.

EDIT :
testé mais infructueux.
Ça bloque avant le montage.
Il faut dire que mon système est plus complexe avec le choix de deux sauvegardes différentes.

Et ajouter le -U.

Oui, j’ai essayé mais si tu me dis où, je veux bien refaire.
N’oublie pas que ça coince avant le “mount”

pour repérer le bon uuid de manière simple :

De là repères l’uuid de ton sdb
Normalement c’est un bloc comme indiqué dans mon précédent post (en terme de nombre de caractères)

Après, ton point de montage doit exister.
S’il n’existe pas, il faut le créer.
Par exemple, tu peux faire ainsi juste avant le bloc qui monte le disque

# on vérifie que le point de montage existe
# s'il n'existe pas, on essaie de le créer et on revérifie
# si la création a échoué une seconde fois, on stop tout

if [ -d ${MOUNTPOINT} ]; then
	printf "Le repertoire existe deja.\n"
else
	mkdir ${sync_directory}
	if [ -d ${sync_directory} ]; then
        	printf "Creation du repertoire reussie.\n"
	else
		printf "Impossible de creer le repertoire.\n"
		exit 0
	fi
fi

Une fois que tout ça est bon, tu peux monter ton disque avec le mount -U
Le -U est important car c’est lui qui défini l’utilisation de l’uuid

Je comprends bien ce que tu m’explique mais j’ai l’impression que tu es resté sur le fil précédent.
Lis le script comme il est écrit maintenant et tu verras que ce n’est pas au montage que ça coince mais AVANT.
Lis ça complètement :
http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e

EDIT :
ensuite, trouve-moi le moyen de remplacer /dev/sdb10 par l’UUID, dans cette ligne :
ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’)

J’ai essayé en créant une variable mais … refusé.

à remplacer par 
[code]ddext=('' 'uuid de sdb9' 'uuid de sdb10')[/code]
********************
la fonction sortie_propre devient inutile
********************
[code]
case ${REPLY} in
   	[1-2]) 	
index=${REPLY}
	if [ ! -e "${ddext[index]}" ] 
 	then 
		printf "\n Impossible de se connecter à %s \n Vérifiez qu'il s'agit de la bonne partition et recommencez \n" "${ddext[index]}" >&2; exit 1;
	else
		if ! grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab 
		then
			sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "$mount_rep" || { deja_montee=1; sortie_propre; }
			break 
		else
			printf "Info : La partition ${ddext[$index]} est déjà montée\n" 
			deja_montee=1 
			break 
		fi		
	fi	
;;
	3) echo "On sort du script"; sortie_propre 
;;
	*) echo "Saisie non valide !"
;;
esac
done[/code]

[b]à remplacer par[/b]

[code]case ${REPLY} in
   	[1-2]) 	
index=${REPLY}
	if [ ! sudo mount -t "${systeme_fich[$index]}" -U "${ddext[$index]}" ${mount_rep} ] 
 	then 
		printf "\n Impossible de monter la partition" >&2; exit 1;
	fi
;;
	3) echo "On sort du script"; exit 0
;;
	*) echo "Saisie non valide !"
;;
esac
done[/code]

...à tester ainsi en n'oubliant pas de renseigner les uuid

edit: c/c foireux.. j'avais zapé un $ x_x

à remplacer par


la fonction sortie_propre devient inutile


case ${REPLY} in [1-2]) index=${REPLY} if [ ! -e "${ddext[index]}" ] then printf "\n Impossible de se connecter à %s \n Vérifiez qu'il s'agit de la bonne partition et recommencez \n" "${ddext[index]}" >&2; exit 1; else if ! grep -q "^${ddext[$index]} "$mount_rep" ${systeme_fich[$index]}" /etc/mtab then sudo mount -t "${systeme_fich[$index]}" "${ddext[$index]}" "$mount_rep" || { deja_montee=1; sortie_propre; } break else printf "Info : La partition ${ddext[$index]} est déjà montée\n" deja_montee=1 break fi fi ;; 3) echo "On sort du script"; sortie_propre ;; *) echo "Saisie non valide !" ;; esac done

à remplacer par

case ${REPLY} in [1-2]) index=${REPLY} if [ ! sudo mount -t "${systeme_fich[$index]}" -U "${ddext[$index]}" ${mount_rep} ] then printf "\n Impossible de monter la partition" >&2; exit 1; fi ;; 3) echo "On sort du script"; exit 0 ;; *) echo "Saisie non valide !" ;; esac done

…à tester ainsi en n’oubliant pas de renseigner les uuid

edit: c/c foireux… j’avais zapé un $ x_x

Oui mais dans ce cas, tu enlèves des tests qui ont été mûrement réfléchis.
La fonction sortie_propre() ne sert pas que là.
Je laisse tes appréciations à l’étude de MisterFreez et de Totor, car je ne suis pas sûr que l’avantage des UUIDs soit bénéfique dans la balance contre la suppression de deux (au moins) tests.
Mon avis est qu’il faudrait ne rien enlever tout en rajoutant la possibilité des UUIDS.

Pour la référence du script “à jour” :
http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_altern%C3%A9e

[quote=“ricardo”]Oui mais dans ce cas, tu enlèves des tests qui ont été mûrement réfléchis.
[/quote]
oui et non

Dans mon bloc, le if fait plusieurs choses.

Le if en fait tente directement le mount par l’uuid
Si cela échoue pour une quelconque raison que ce soit, alors il renvoie true. Autrement il renvoie false, ce qui implique non seulement que le disque était présent, accessible, que la partition l’était aussi, mais surtout que le mount s’est effectué convenablement.

De même, si la partition ciblée, référencée par l’uuid est déjà montée, alors le if renvoie true aussi car le mount échouera.
Si tu veux continuer alors tes actions dans le cas où la partition est déjà montée, il suffit de l’indiquer en lisant oui le fichier mtab et d’y rechercher ton point de montage
autrement dit, ce serait qlqch comme ça dans ton cas :

case ${REPLY} in [1-2]) index=${REPLY} if [ ! sudo mount -t "${systeme_fich[$index]}" -U "${ddext[$index]}" ${mount_rep} ] then if [ $(cat /etc/mtab | grep ${mount_rep} | wc -l) -gt 0 ] then printf "\n La partition est déjà montée" sync else printf "\n Impossible de monter la partition" >&2; exit 1; fi fi ;; 3) echo "On sort du script"; exit 0 ;; *) echo "Saisie non valide !" ;; esac done

ps: il manque des {}et $ dans ton script à plusieurs endroits
exemple

manque $ devant index
du reste, beaucoup de tes variables sont sans les {}, alors que d’autres les ont
C’est plus propre je trouve de les mettre sur tout variable et ça évite plus tard d’en oublier malencontreusement :slightly_smiling:

[quote=“Mitsu”]…
ps: il manque des {}et $ dans ton script à plusieurs endroits
exemple

manque $ devant index
du reste, beaucoup de tes variables sont sans les {}, alors que d’autres les ont
C’est plus propre je trouve de les mettre sur tout variable et ça évite plus tard d’en oublier malencontreusement :slightly_smiling:[/quote]
Exact pour les manques, des oublis que je vais réparer :blush:

EDIT :
Fait, j’espère ne pas en avoir oublié :wink:
Pour la référence du script “à jour” :

isalo.org/wiki.debian-fr/ind … ern%C3%A9e

Bonsoir,

Je ne suis toujours pas rentré et je m’étais interdit de répondre avant mon retour mais je ne peux laisser passer ceci :

[quote=“Mitsu”]
ps: il manque des {}et $ dans ton script à plusieurs endroits
exemple

manque $ devant index[/quote]

C’est faux ! l’utilisation d’une variable pour indicer un tableau ne nécessite pas de $ (et donc de {}). Je suppose, ricardo, que tu as procédé à différents tests en alternant le choix du DD ? As-tu rencontré des problèmes lié à cet “index” ?
Il existe 1 autre cas de figure où cela n’est pas utile : les expressions arithmétiques
ex :

  • if ((index != 0)); then echo “index > 0”; fi
  • ddsuivant=${ddext[$((index+1))]}

Quand au reste, je n’ai parcouru qu’en diagonale et je ne peux débattre sans me pencher plus posément sur la problématique soulevée et surtout sur l’alternative proposée. Tout ce que je peux dire dans l’immédiat c’est :

  1. Oui, l’uuid peut s’avérer un meilleur choix
  2. question : que faire en cas de changement de dd car l’ancien est en rade et/ou en manque de capacité… cela revient au même, il faut modifier le script. Cette remarque est d’ailleurs valable en l’état et c’est pour cela que j’avais proposé de rendre autonome (et indépendant de la plateforme et donc du matériel) le script par le biais de paramètres.

C’est un “lourd” chantier que j’avais toujours en tête…

voilà et @+

ps :

–> udevadm --query=name --name= devrait donner l’info il me semble (pas tester donc à vérifier)

Non, je n’avais aucun problème avant, ni après avoir effetué les modifs proposées par Mitsu.
Je ne sais plus à quel Saint me vouer :119
J’aimerais bien que MisterFreez arbitre le débat.

Demain, je lis vraiment en diagonale ces deux derniers jours, mais à partir de demain j’ai mon week end de 3 jours :slightly_smiling:

[quote=“ricardo”]Non, je n’avais aucun problème avant, ni après avoir effetué les modifs proposées par Mitsu.
Je ne sais plus à quel Saint me vouer :119
J’aimerais bien que MisterFreez arbitre le débat.[/quote]
Il y a 3 manières décentes d’adresser les partitions :
[ul]
[li]le fichier représentant le périphérique /dev/sdXn. Il pose des problèmes car il n’est pas forcément toujours le même.[/li]
[li]l’UUID pas agréable à utiliser mais fiable, il change lorsque l’on modifie la partition ou son système de fichier[/li]
[li]les labels, comme les UUID, sauf qu’ils sont choisi par l’utilisateur. Ils ne sont par contre pas nécessairement uniques (dans ce cas il semble que le noyau garde toujours le denier). Mais bon c’est très rare.[/li][/ul]

Le choix est une question de goût (moi j’aime bien les labels).

Par contre les propositions de Mitsu, pour gérer les différents cas lors du montage n’ont rien de spécifiques à l’une des méthodes. Après quelques tests moi je propose quelque chose comme ça :

out=$(mount -L EXT /mnt/EXT 2>&1) if [ ! -z "${out}" ]; then if [ $(echo "${out}" | grep -c 'ajready mounted') -eq 1 ]; then echo "Déjà monté" else echo "Erreur du mount" fi fi
Le problème c’est que je ne suis pas sûr que mount parle toujours anglais.

Sinon comme il a était fait mention de problèmes possible liés à /etc/mtab, on peut vérifier que le point de montage est déjà utilisé ainsi :

mawk -v dir="${mount_rep}" '$2==dir { exit 1 }' /proc/mounts if [ "$?" -eq 1 ]; then echo "Point de montage déjà utilisé" fi
/proc n’est jamais by-passé et est toujours accessible.

Je suis conscient que je ne te ménage pas là ricardo avec mawk. Imagine mawk (c’est pareil pour awk, mawk a juste un peu plus de fonctionnalité), comme un grep hyper évolué. Le “-v dir=$var” permet de passer une variable à mawk (c’est une fonctionnalité spécifique à mawk). Ensuite on a la chaîne ‘$2==dir { exit 1 }’, la première partie (avec le ==) est une condition et la seconde partie (entre {}) est un bloc de code. Cela signifie que pour chaque ligne du fichier passé en paramètre qui valide la condition on exécute le bloc de code.

Ici la condition ($2==dir) signifie que le bloc de code seras exécuté pour toutes les lignes dont le second champ est égale à la variable dir. Un champ est un mot d’une ligne séparé par des espaces (par défaut).

Là le bloc de code est simple, on quite awk avec le code 1 (comme avec le exit de bash).

Par exemple, si on passe le fichier :

/dev/sda1 /mnt/1 ext4 ... /dev/sda2 /mnt/2 btrfs ...
Il va commencer par lire la première ligne, la découper selon les espaces (donc ici les trois premiers champs seront “/dev/sda1”, “/mnt/1” et “ext4”). Puis il va regarder si “/mnt/1” est identique au contenu de la variable dir si c’est le cas il quitte le programme (exit 1), sinon il passe à la ligne suivante.

Voila si tu ne préfère pas te prendre la tête avec awk, c’est pas un problème il est possible de gérer le cas avec un grep (c’est juste que je trouve awk plus joli).

Bon, je reviens dans un mois hein ! le temps de tout déchiffrer :119
Je rigole mais je commence à perdre les pédales car je suis sur deux réponses en même temps, ce qui est une grave erreur de ma part.
Je vais laisser ce problème en attente pour d’abord en terminer définitivement avec le bloc ‘corbeille’.
On y reviendra ensuite, si tu le veux bien.

Eh bien, il suffit de lui demander gentiment (comme pour tout autre programme dont on a besoin d’analyser la sortie de manière fiable, au hasard ifconfig, que je vais d’ailleurs prendre pour exemple). :wink:

[code]# récupérer la ligne contenant l’adresse IP et le masque dans ifconfig
ifconfig lo | grep -F 'inet adr:'
inet adr:127.0.0.1 Masque:255.0.0.0

cool, ça marche… sur ma machine configurée en français… mais je vais avoir un souci pour diffuser ça à l’international !

pour s’assurer que ça marchera sur n’importe quelle machine, anglaise, française, allemande, chinoise, klingon, il faut forcer la langue de sortie…

sauvegarder la langue courante pour pouvoir la remettre après

OLD_LANG="$LANG"

aucune langue = anglais

LANG=""

récupérer l’adresse IP (on notera les deux ‘d’ à ‘addr’ contrairement au français, de même que le terme ‘Mask’ dans la sortie et non plus ‘Masque’)

ifconfig lo | grep -F 'inet addr:'
inet addr:127.0.0.1 Mask:255.0.0.0

on remet la langue d’origine

LANG="$OLD_LANG"[/code]

Allez puisque tu m’embête. Par défaut dans mon environnement j’ai ça :

Et il est donc en anglais.

Maintenant on va faire une annalyse un peu plus poussé.

$ which moun /bin/mount $ dpkg -S $(!!) mount:/bin/mount $ apt-cache show mount ... pleins de trucs ... Pre-Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.6), libselinux1 (>= 2.0.15), libsepol1 (>= 1.14), libuuid1 (>= 2.16) Suggests: nfs-common (>= 1:1.1.0-13) ... pleins d'autres trucs ...
Donc il n’a pas de paquet internationalisation ensuite :

$ ldd /bin/mount linux-vdso.so.1 => (0x00007fffe21ff000) libblkid.so.1 => /lib/libblkid.so.1 (0x00007feaa683c000) libuuid.so.1 => /lib/libuuid.so.1 (0x00007feaa6638000) libselinux.so.1 => /lib/libselinux.so.1 (0x00007feaa6419000) libsepol.so.1 => /lib/libsepol.so.1 (0x00007feaa63dd000) libc.so.6 => /lib/libc.so.6 (0x00007feaa607c000) /lib64/ld-linux-x86-64.so.2 (0x00007feaa6a6d000) libdl.so.2 => /lib/libdl.so.2 (0x00007feaa5e77000)
Pas de liens ver gettext ou une autre bibliothèque d’internationalisation.
Enfin :

$ dpkg -L mount /. /bin /bin/umount /bin/mount /usr /usr/share /usr/share/doc /usr/share/doc/mount /usr/share/doc/mount/README.mount /usr/share/doc/mount/copyright /usr/share/doc/mount/changelog.gz /usr/share/doc/mount/examples /usr/share/doc/mount/examples/fstab /usr/share/doc/mount/changelog.Debian.gz /usr/share/man /usr/share/man/man8 /usr/share/man/man8/mount.8.gz /usr/share/man/man8/swapoff.8.gz /usr/share/man/man8/umount.8.gz /usr/share/man/man8/losetup.8.gz /usr/share/man/man8/swapon.8.gz /usr/share/man/man5 /usr/share/man/man5/fstab.5.gz /usr/share/lintian /usr/share/lintian/overrides /usr/share/lintian/overrides/mount /sbin /sbin/losetup /sbin/swapon /sbin/swapoff
Aucun fichier ne semble travailler sur l’internationalisation.

Donc voila s’il y a possibilité de l’internationalisé, je ne sais pas comment faire. Si tu pouvais lancer un petit :

Ça permettrais de voir si ton installation est différente de la mienne.

Il est en anglais aussi chez moi.

Cela dit, je réagissais uniquement sur le “je ne suis pas sûr” en te donnant une technique dont je me sers souvent pour “être sûr”, quoi qu’il arrive, et qui est valable pour toutes les commandes (donc assez utile)… :wink:

J’avoue, moins je me pose de questions mieux je me porte, et mon caractère fait que je préfère éliminer la source du problème plutôt que de laisser le moindre doute subsister (ou même que de chercher si problème il y a réellement). Appelons ça de la fainéantise appliquée… :eusa-whistle:

À 2h du mat’, je suis généralement moins systématique qu’en journée.

Le script complet est ici, je demande qu’il ne soit plus proposé d’autre modifications, sauf si une erreur grave était découverte. Merci à tous pour l’aide apportée.

[code]#!/bin/bash

BEGIN INIT INFO

Nom du script : sauvegarde

Auteur : Ricardo, aidé de l’équipe de ‘debian-fr.org

Date de création : juillet 2011

Utilité : faciliter les sauvegardes

Version : cette version est écrite pour l’utilisation avec deux partitions de sauvegarde, à alterner dans le temps.

#+ Il est souhaitable que ces partitions soient sur un DD différent de celui qui abrite le système.
#+ Ce script a été écrit de façon à ce qu’il soit le plus générique possible. Les seules données que vous devriez devoir changer,
#+ se trouvent dans la partie droite des variables.

Pre-requis : voir tuto = http://www.debian-fr.org/sauvegarde-clonage-d-une-sid-t25179.html

#+ et page du WIKI = http://www.isalo.org/wiki.debian-fr/index.php?title=Script_de_double_sauvegarde_alternée

Description : script permettant d’effectuer, régulièrement et de façon simple, les sauvegardes de son système

Droits : entièrement libres mais en cas de copie, la citation de “debian-fr.org” nous serait agréable

Modifié le : 22 août 2011

Objet de la modification : améliorations diverses

END INIT INFO

#----------------- Fonctions ----------------------------
function sauvegarde()
{
sudo rsync -av --del --backup --backup-dir="$1" --exclude-from="$2" “$3” “$4”

	# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
	if (("$?" > 0))
	then
			printf "\nErreur lors de la sauvegarde de %s\n" "$3" 
	else
			printf "\nSauvegarde de %s : OK\n" "$3"
			sleep 10
	fi  

}

function sortie_propre()
{
# Si la partition de sauvegarde n’était pas montée lors de l’appel, on la démonte avant de sortir.
if [ “${deja_montee}” = 0 ]
then
sudo umount "${mount_rep}"
else
# Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter mais en s’assurant que les données ont bien été écrites.
sync
fi
exit
}

#----------------- Variables -------------------

CETTE PARTIE DOIT RETENIR TOUTE VOTRE ATTENTION, C’EST LÀ QUE VOUS PERSONNALISEREZ CE SCRIPT

#+ POUR CE FAIRE, JE VOUS CONSEILLE DE VOUS RÉFÉRER AU TUTO ET AU SCRIPT INDIQUÉS DANS LE “PRE-REQUIS” DU “BEGIN INIT INFO”

mount_rep="/mnt/autre"

la première donnée, vide, figure le [0], de façon à commencer par [1]

ddext=(’’ ‘/dev/sdb9’ ‘/dev/sdb10’)
systeme_fich=(’’ ‘ext3’ ‘ext2’)
controle=(’’ ‘/home/controle’ ‘/home/controle-ricardo’)
exclure=(’’ ‘/root/exclure’ ‘/home/ricardo/.exclure’)
sauve=(’’ ‘/mnt/autre/sauve’ ‘/mnt/autre/sauve-ricardo’)
dossier_a_sauver=(’’ ‘/’ ‘/home/ricardo’)

#----------------- Départ du script ----------------------------

Teste l’existence du dossier de montage, sinon, on sort avec erreur 1.

mkdir -p "${mount_rep}" || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }	

Choix, puis test de la partition de sauvegarde. Si le montage ne s’effectue pas, on sort via la fonction sortie_propre()

deja_montee=0
PS3="Entrez le N° de la sauvegarde choisie : "
select choix_sauvegarde in “sauve” “sauve2” quitter
do
case ${REPLY} in
[1-2])
index=${REPLY}
if [ ! -e “${ddext[$index]}” ]
then
printf “\n Impossible de se connecter à %s \n Vérifiez qu’il s’agit de la bonne partition et recommencez \n” “${ddext[$index]}” >&2; exit 1;
else
if ! grep -q “^${ddext[$index]} “${mount_rep}” ${systeme_fich[$index]}” /etc/mtab
then
sudo mount -t “${systeme_fich[$index]}” “${ddext[$index]}” “${mount_rep}” || { deja_montee=1; sortie_propre; }
break
else
printf "Info : La partition ${ddext[$index]} est déjà montée\n"
deja_montee=1
break
fi
fi
;;
3) echo “On sort du script”; sortie_propre
;;
*) echo “Saisie non valide !”
;;
esac
done

Teste l’emplacement de la corbeille et si elle est pleine (présence de fichier(s) dans … /files). Si elle l’est, liste les fichiers qu’elle contient

echo -e “\033[4mCONTENU de la CORBEILLE\033[0m\n”

[ -z “$XDG_DATA_HOME” ] && chemin_trash="$HOME/.local/share/Trash" || chemin_trash="$XDG_DATA_HOME/Trash"
corbeille="$chemin_trash/files"

if [ -z $(ls -A "$corbeille") &> /dev/null ] 
then
	echo "LA CORBEILLE EST VIDE"		
else		 
	ls -a "$corbeille"	
	read -p "on peut la vider  ? o/* : " vider	 
		if [ "$vider" = o ] 
		then	
			shopt -s dotglob
			rm -rf "$chemin_trash"/{files/,info/,metadata}*
			shopt -u dotglob
			echo "CORBEILLE VIDÉE"
		else
			echo -e "\033[4mCORBEILLE CONSERVÉE PLEINE\033[0m"
		fi		
fi 		

Ordre de sauvegarde faisant appel à la fonction ‘sauvegarde()’

read -p "prêt pour la sauvegarde ? o/* : " onyva
if [ “$onyva” = o ]
then
for((index=1; index < ${#controle[@]}; index++))
do
sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier_a_sauver[$index]}” "${sauve[$index]}"
done
fi
sortie_propre

[/code]