# Travail terminé, corrections

**URL:** <https://www.debian-fr.org/t/travail-termine-corrections/33195>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:54 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195 "2016-02-21T02:54:53Z")\
**Posts on this page:** 20\
**Page:** 9

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/161 "2016-02-21T03:01:32Z")

</div>

[quote=«&nbsp;ricardo&nbsp;»]  
Or là, l’incrémentation se fait avant l’appel à la fonction, ce qui me semble illogique.  
EDIT :  
Je ne remets pas en cause cette «&nbsp;logique&nbsp;» et je la comprends aussi 😃[/quote]  
 ![:think:](https://www.debian-fr.org/uploads/default/original/1X/98cae0704aea0201d04f151843e80a3ecd391eca.gif "Think") je vois …  
Alors ceci te semblera plus adapté :

```auto
index=1
while ((index < ${#controle[@]}))
do
   appel_fonction
   ((index++))
done
```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/162 "2016-02-21T03:01:33Z")

</div>

Ah oui, là c’est plus “causant” et c’est où mes souvenirs étaient restés. Je n’aurais même pas demandé d’explications.  
Donc ça existe bien encore ?  
Cela dit, je ferai comme vous l’indiquez pour être dans le vent 😃

EDIT :  
Je viens de me rendre compte que je confondais ‘for’ et ‘while’ 😊

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/163 "2016-02-21T03:01:33Z")

</div>

[quote=“ricardo”]Ah oui, là c’est plus “causant” et c’est où mes souvenirs étaient restés. Je n’aurais même pas demandé d’explications.  
Donc ça existe bien encore ?  
Cela dit, je ferai comme vous l’indiquez pour être dans le vent 😃 [/quote]  
La boucle for n’a rien de nouveau (elle existait en c, fortran, COBOL et en pascal 😉 ) à toi de faire ton choix entre :

`index=1
while ((index < ${#controle[@]}))
do
   appel_fonction
   ((index++))
done`  
et

`
for (( index=1 ; index < ${#controle[@]} ; index++ ))
do
   appel_fonction
done`  
Pour la lecture de la seconde boucle, tu peut dire « pour i allant de 1 à taille de controle - 1 (attention faut pas l’oublier), faire l’appel de fonction ». Ou pour suivre le code plus précisément « pour i allant de 1 à taille de controle - 1 (attention faut pas l’oublier) et incrémenté de 1 en 1, faire l’appel de fonction ».

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/164 "2016-02-21T03:01:33Z")

</div>

Oui Michel, comme tu l’expliques ( « pour i allant de 1 à taille de controle…), je n’aurais ptet pas fait de confusion.  
Ce qui m’a induit en erreur, c’est le «&nbsp;on boucle tant que index…&nbsp;» de Totor car pour moi, ‹&nbsp;tant que&nbsp;› = ‹&nbsp;while&nbsp;› dans ma mémoire.  
Je suis content quand même d’approfondir ces broutilles, ça me permets de réfléchir à ce que je fais et non de faire sans comprendre.  
Impec tout ça, je vais faire dans l’AM ou ce soir et je vous le présenterai.  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/165 "2016-02-21T03:01:33Z")

</div>

Je reviens à la charge :

> [@](#):
>
> Pour la lecture de la seconde boucle, tu peut dire … Ou pour suivre le code plus précisément « pour i allant de 1 à taille de controle - 1 (attention faut pas l’oublier) et incrémenté de 1 en 1, faire l’appel de fonction ».

Quand tu précises qu’il ne faut pas oublier le ‹&nbsp;-1&nbsp;›, tu peux expliquer et me dire où il est mentionné dans la ligne ?

```auto
for (( index=1 ; index < ${#controle[@]} ; index++ ))
```

EDIT :  
Je pense avoir la réponse avec ce qu’à écrit Totor :

[quote]- au premier tour de boucle : index vaut 1 et il y a 3 éléments dans le tableau controle (1 est bien inférieur à 3) → sauvegarde avec les éléments ayant pour indice 1

- au second tour, index vaut 2 et il y a toujours 3 éléments dans le tableau controle (et 2\<3) → sauvegarde avec les éléments ayant pour indice 2
- au troisième tour, index est à 3 et il y a toujours 3 éléments dans le tableau controle. Par contre, 3 n’est pas inférieur à 3 donc on ne fait plus appel à la fonction  
[/quote]  
Je ne percutais pas avec ce nombre de 3 éléments mais c’est à partir de ‹&nbsp;0&nbsp;› avec le premier qui est un ‹&nbsp;vide&nbsp;›, c’est ça ?  
Donc, comme le for démarre à 1, puis passe à 2, le ‹&nbsp;3&nbsp;› est échappé d’office. J’ai bon ?  
controle=(‹&nbsp;&nbsp;› ‹&nbsp;/home/controle&nbsp;› ‹&nbsp;/home/controle-ricardo&nbsp;›)  
…1…2…3

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/166 "2016-02-21T03:01:35Z")

</div>

Alors, je viens de faire un premier jet, testé\_qui\_va\_bien.  
c’est bon ?  
J’ai intégré dans le script (ligne «&nbsp;read…&nbsp;»), le test «&nbsp;teste si la sauvegarde a abouti&nbsp;»  
Ça fait ptet un peu fouillis mais ça fonctionne. Autre solution ?

`function test_sauvegarde()
{
	sudo rsync -av --del --backup --backup-dir="${controle[$index]}" --exclude-from="${exclure[$index]}" "${dossier_a_sauver[$index]}" "${sauve[$index]}"
}
`

[code]#-----------------Variables-------------------  
mount\_rep=«&nbsp;/mnt/autre&nbsp;»

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

ddext=(‹&nbsp;&nbsp;› ‹&nbsp;/dev/sdb9&nbsp;› ‹&nbsp;/dev/sdb10&nbsp;›)  
systeme\_fich=(‹&nbsp;&nbsp;› ‹&nbsp;ext3&nbsp;› ‹&nbsp;ext2&nbsp;›)  
controle=(‹&nbsp;&nbsp;› ‹&nbsp;/home/controle&nbsp;› ‹&nbsp;/home/controle-ricardo&nbsp;›)  
exclure=(‹&nbsp;&nbsp;› ‹&nbsp;/root/exclure&nbsp;› ‹&nbsp;/home/ricardo/.exclure&nbsp;›)  
sauve=(‹&nbsp;&nbsp;› ‹&nbsp;/mnt/autre/sauve&nbsp;› ‹&nbsp;/mnt/autre/sauve-ricardo&nbsp;›)  
dossier\_a\_sauver=(‹&nbsp;&nbsp;› ‹&nbsp;/&nbsp;› ‹&nbsp;/home/ricardo&nbsp;›)  
[/code]

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

				# Teste si la sauvegarde a abouti ( = 0), sinon, on sort.
				if (("$?" > 0))
				then
   					printf "\nErreur lors de la sauvegarde de %s\n" "${dossier_a_sauver[$index]}" >&2
   					exit 1
				else
					printf "\nSauvegarde de %s : OK\n" "${dossier_a_sauver[$index]}"
				fi      			
		done
	else
      		exit 1
   	fi
```

EDIT :  
Il faut ajouter quelque chose à la fin de la fonction «&nbsp;test\_sauvegarde&nbsp;» pour que ça sorte en cas d’erreur ou ce qui est traité dans le script suffit ?  
Le copié/collé pour le code n’est pas terrible au niveau de l’alignement ![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere")

Plus clair :  
 ![](https://www.debian-fr.org/uploads/default/original/2X/6/66f48b6191c60729584cee355f3815969dc74ece.jpg)

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/167 "2016-02-21T03:01:36Z")

</div>

3 remarques (avant mon départ ![:dance:](https://www.debian-fr.org/uploads/default/original/1X/c5479df83c1e5adae8782ae88416ebec2c474ae1.gif "Dance") ) :  
1/ ligne test\_sauvegarde «&nbsp;$controle&nbsp;» «&nbsp;$exclure&nbsp;» «&nbsp;$dossier\_a\_sauver&nbsp;» «&nbsp;$sauve&nbsp;»  
A ton avis, quelles sont les valeurs des variables «&nbsp;$controle&nbsp;» «&nbsp;$exclure&nbsp;» «&nbsp;$dossier\_a\_sauver&nbsp;» «&nbsp;$sauve&nbsp;» ?

2/ ligne sudo rsync -av --del --backup --backup-dir=«&nbsp;${controle[$index]}&nbsp;» --exclude-from=«&nbsp;${exclure[$index]}&nbsp;» «&nbsp;${dossier\_a\_sauver[$index]}&nbsp;» «&nbsp;${sauve[$index]}&nbsp;»  
pourquoi utiliser directement les tableaux puisque tu passes ces données en paramètre de la fonction 😉

3/ les lignes if ((«&nbsp;$?&nbsp;» \> 0))  
then  
printf «&nbsp;\nErreur lors de la sauvegarde de %s\n&nbsp;» «&nbsp;${dossier\_a\_sauver[$index]}&nbsp;» \>&2  
exit 1  
else  
printf «&nbsp;\nSauvegarde de %s : OK\n&nbsp;» «&nbsp;${dossier\_a\_sauver[$index]}&nbsp;»  
fi  
  sont à intégrer dans le corps de la fonction puis traiter le point 2 !

sur ce, je passe la main ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut") ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

mais félicitations ![:clap:](https://www.debian-fr.org/uploads/default/original/1X/dcfd4d2428519214f79b4b87bcebcb3197047574.gif "Clap") tu as compris beaucoup de choses !

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/168 "2016-02-21T03:01:37Z")

</div>

[quote=“Totor”]  
1/ ligne test\_sauvegarde “$controle” “$exclure” “$dossier\_a\_sauver” "$sauve"  
A ton avis, quelles sont les valeurs des variables “$controle” “$exclure” “$dossier\_a\_sauver” “$sauve” ? [/quote]  
Une chose à la fois, pour le 1/, je suppose qu’il faut donc écrire :

```auto

```

?

EDIT :  
Pour le 2/, j’ai compris ma connerie 😊  
à remplacer par :

```auto

```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/169 "2016-02-21T03:01:37Z")

</div>

@ricardo \> Ceci

```auto

```

C’est équivalent à :

`controle[0]=''
controle[1]='/home/controle'
controle[2]='/home/controle-ricardo'`  
et `${#controle[@]} # vaut 3`  
Donc i vaut 1 (tu l’initialise à 1), puis 2. Donc i va de 1 à taille de controle - 1.  
C’est le test inférieur strict qui permet de s’en assurer.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/170 "2016-02-21T03:01:38Z")

</div>

Merci Michel, ça je l’avais compris.  
Je redonne avec mes dernières modifs mais j’ai un doute sur le 3/ de Totor  
Ce script fonctionne mais est-ce correct :

[code]#---------------------------------------------  
function test\_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" >&2
			exit 1
	else
			printf "\nSauvegarde de %s : OK\n" "$3"
	fi  

```

}

#-----------------Variables-------------------  
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’)  
#---------------------------------------------  
read -p "prêt pour la sauvegarde ? o/\* : " onyva  
if [“$onyva” = o]  
then  
for((index=1; index \< ${#controle[@]}; index++))  
do  
test\_sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier\_a\_sauver[$index]}” “${sauve[$index]}”   
done  
else  
exit 1  
fi  
[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/171 "2016-02-21T03:01:38Z")

</div>

A ta place je retirerais le exit 1 de la fonction. Comme ça même si la première sauvegarde se rate il essaieras tout de même le second.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/172 "2016-02-21T03:01:38Z")

</div>

OK, je supprime.  
Pour le reste, c’est bon ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/173 "2016-02-21T03:01:39Z")

</div>

> [@ricardo](#):
>
> Pour le reste, c’est bon ?

Ça y est Totor n’est plus là, tu essaie de te défiler ? 😆

Pour bien faire les choses, je vois encore un dernier problème. Totor disais à juste titre un tôt dans le sujet que par principe ce serais bien que le programme laisse le système dans l’état où il était avant l’exécution.

Le problème c’est qu’en l’état tu as de multiples points de sortie (chaque exit) et qu’il faudrait démonter les partitions montées lorsque le programme sort inopinément. Pour faire ça bien il faudrait limiter le nombre de point de sorti (que les sorti d’erreur où il faut nettoyer soient encapsulée). Pour ça, il suffit de le mettre dans une fonction (oui encore une…), je propose de l’appeler cleanNexit ou nettoyage\_sorti (ou autre) si tu préfère le français. Cette fonction devrait :  
[ul][li]démonter les partitions si elles ont étaient montées par ton script[/li]  
[li]sortir en erreur[/li][/ul]

Je te laisse avec ces indications, je repasse ce soir de toute manière.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/174 "2016-02-21T03:01:45Z")

</div>

En fait, je crois que ce problème avait déjà été réglé.  
Je reprends tout le script et je te donne mon avis entre les lignes avec ##### en début :

[code]#----------------- Fonctions ----------------------------  
function test\_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"
	fi  

```

}

#----------------- Variables -------------------  
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 des partitions de sauvegarde et celle du dossier de montage, sinon, on sort avec erreur 1.

```
[-e "${ddext[1]}" ] && [-e "${ddext[2]}" ] || { echo "Le DDext ne répond pas !" >&2; exit 1; } 

```

##### NE FAIT QUE TESTER L’EXISTENCE DES PARTITION MAIS NE MONTE PAS

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

```

##### NE FAIT QUE TESTER L’EXISTENCE DU DOSSIER DE MONTAGE MAIS NE MONTE PAS

# Choix de la sauvegarde. Si le montage ne s’effectue pas, on sort avec erreur 1.

deja\_montee=0  
PS3="Entrez le N° de la sauvegarde choisie : "  
select sauvegarde in “sauve” “sauve2” quitter  
do  
case ${REPLY} in  
[1-2])   
index=${REPLY}  
if ! grep -q “^${ddext[$index]} “$mount\_rep” ${systeme\_fich[$index]}” /etc/mtab  
then  
sudo mount -t “${systeme\_fich[$index]}” “${ddext[$index]}” “$mount\_rep” || exit 1;

##### PAR EXEMPLE, JE ME POSE LA QUESTION DE L’UTILITÉ DE CE ‘EXIT’ QUI FAIT DOUBLE FONCTION AVEC LE ‘ELSE’ SUIVANT

##### EN ADMETTANT QU’ON SUPPRIME CE ‘EXIT’, ON MONTE LA PARTITION QUI NE L’ÉTAIT PAS, SELON LE TESTE DU DESSUS ET ON NE MODIFIE PAS ‘DEJA\_MONTE’ QUI RESTE À ‘0’

##### + DANS CE CAS, LA PARTITION SERA REMISE EN L’ÉTAT DE DÉPART GRÀCE À LA DERNIÈRE CONDITION DU SCRIPT

```
		break 
	else
		printf "Info : La partition ${ddext[$index]} est déjà montée\n" 
		deja_montee=1 

```

##### SI C’ÉTAIT DÉJÀ MONTÉ AU DÉPART, C’EST RÉTABLI À LA FIN

```
		break 
	fi

```

;;  
3) echo “On sort du script”; exit;

##### LÀ, IL S’AGIT D’UNE SORTIE VOLONTAIRE AVANT QU’UNE PARTITION N’AIT ÉTÉ MONTÉE

;;  
\*) echo “Saisie non valide !”  
;;  
esac  
done

# Teste si la corbeille est pleine (pé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"  
if [-e ~/.local/share/Trash/files/]   
then  
ls ~/.local/share/Trash/files   
read -p "on peut la vider ? o/\* : " corbeille   
if [“$corbeille” = o]  
then  
rm -rf ~/.local/share/Trash/\*  
echo -e "\033[4mCORBEILLE VIDÉE\033[0m"  
fi  
else  
echo "La corbeille est vide"  
fi

# Ordre de sauvegarde faisant appel à la fonction ‘test\_sauvegarde’

read -p "prêt pour la sauvegarde ? o/\* : " onyva  
if [“$onyva” = o]  
then  
for((index=1; index \< ${#controle[@]}; index++))  
do  
test\_sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier\_a\_sauver[$index]}” “${sauve[$index]}”   
done  
else  
exit 1

##### ÉVENTUELLEMENT, C’EST LE SEUL QUI POSE PROBLÈME, IL N’A D’UTILITÉ QUE SI ON DÉCIDE DE NE PLUS SAUVEGARDER. ON NE POURRAIT PAS LE REMPLACER

##### + PAR UN ‘SAUT’ VERS LA SUITE, QUI TRAITERAIT LE MONTAGE ÉVENTUEL ?

##### OU ET C’EST PTET CE QUE TU ENVISAGEAIS, TRANSFORMER CETTE DERNIÈRE CONDITION EN FONCTION ’ sortie\_propre() ’ ?

```
fi

```

# Si la partition de sauvegarde était déjà montée lors de l’appel, on sort sans la démonter.

```
if ["$deja_montee" = 0]
then 
	sudo umount "$mount_rep"
else
	sync
fi

```

[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/175 "2016-02-21T03:01:47Z")

</div>

[code]# Teste l’existence des partitions de sauvegarde et celle du dossier de montage, sinon, on sort avec erreur 1.  
[-e “${ddext[1]}” ] && [-e “${ddext[2]}” ] || { echo “Le DDext ne répond pas !” \>&2; exit 1; }

##### NE FAIT QUE TESTER L’EXISTENCE DES PARTITION MAIS NE MONTE PAS

mkdir -p “$mount\_rep” || { echo “Le dossier de montage n’existe pas !” \>&2; exit 1; }

##### NE FAIT QUE TESTER L’EXISTENCE DU DOSSIER DE MONTAGE MAIS NE MONTE PAS[/code]

Nous sommes d’accord.

[code]sudo mount -t “${systeme\_fich[$index]}” “${ddext[$index]}” “$mount\_rep” || exit 1;

##### PAR EXEMPLE, JE ME POSE LA QUESTION DE L’UTILITÉ DE CE ‘EXIT’ QUI FAIT DOUBLE FONCTION AVEC LE ‘ELSE’ SUIVANT

##### EN ADMETTANT QU’ON SUPPRIME CE ‘EXIT’, ON MONTE LA PARTITION QUI NE L’ÉTAIT PAS, SELON LE TESTE DU DESSUS ET ON NE MODIFIE PAS ‘DEJA\_MONTE’ QUI RESTE À ‘0’

##### + DANS CE CAS, LA PARTITION SERA REMISE EN L’ÉTAT DE DÉPART GRÀCE À LA DERNIÈRE CONDITION DU SCRIPT[/code]

Ce serait vrai si le seul cas qui peut faire planter le montage était le fais qu’il soit déjà monté. Il est possible de tenter de le monter avec le mauvais système de fichier par exemple.

```auto

```

Il faudrait faire un exit là, non ?

[code]exit 1

##### ÉVENTUELLEMENT, C’EST LE SEUL QUI POSE PROBLÈME, IL N’A D’UTILITÉ QUE SI ON DÉCIDE DE NE PLUS SAUVEGARDER. ON NE POURRAIT PAS LE REMPLACER

##### + PAR UN ‘SAUT’ VERS LA SUITE, QUI TRAITERAIT LE MONTAGE ÉVENTUEL ?

##### OU ET C’EST PTET CE QUE TU ENVISAGEAIS, TRANSFORMER CETTE DERNIÈRE CONDITION EN FONCTION ’ sortie\_propre() ’ ?[/code]

C’est celui au quel je pensais. La méthode dont tu parle est celle employée par les hackers du noyau. Pour le faire ils utilisent un mécanismes du C appelé goto qui n’existe pas en shell. Pour information ils font plus ou moins comme ça :

```auto
void fonction(void* arg) {
  // premier bout de code
  if (errno != 0) goto clean;

  // second bout de code
  if (errno != 0) goto clean;

  // etc
clean:
  // Code qui libère les ressources
}
```

Le goto permet de « sauter » vers le clean.

Donc nous on a pas ça, le plus simple est donc de mettre le code de libération dans une fonction et de s’en servir (comme tu le disais donc (^\_^)).

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/176 "2016-02-21T03:01:47Z")

</div>

Oui, j’avais pensé au goto du C et du basic mais je me doutais que ça n’existe plus dans les langages modernes.  
Je vais réfléchir au seul truc qui te chiffonne encore

[quote]Ce serait vrai si le seul cas qui peut faire planter le montage était le fais qu’il soit déjà monté. Il est possible de tenter de le monter avec le mauvais système de fichier par exemple.  
[/quote]  
Pour le

[quote]\*) echo «&nbsp;Saisie non valide !&nbsp;»[/quote],  
Tant que tu t’évertues à taper autre chose que 1, 2 ou 3, il boucle et il revient à la question. Donc, si tu veux sortir, tu es obligé de taper ‹&nbsp;3&nbsp;› et dans ce cas, il ‹&nbsp;exit&nbsp;›  
J’avais déjà posé ta question à Totor ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")  
On n’est donc pas loin, je crois.  
Je fais cette fonction tout à l’heure et je te soumets le tout.  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/177 "2016-02-21T03:01:48Z")

</div>

[quote=«&nbsp;ricardo&nbsp;»]Pour le

[quote]\*) echo «&nbsp;Saisie non valide !&nbsp;»[/quote],  
Tant que tu t’évertues à taper autre chose que 1, 2 ou 3, il boucle et il revient à la question. Donc, si tu veux sortir, tu es obligé de taper ‹&nbsp;3&nbsp;› et dans ce cas, il ‹&nbsp;exit&nbsp;›  
J’avais déjà posé ta question à Totor ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green") [/quote]  
Au temps pour moi, tu as raison (à ma décharge je ne suis pas habitué aux « bashismes »).

[quote=«&nbsp;ricardo&nbsp;»]On n’est donc pas loin, je crois.  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut") [/quote]  
Clairement, le script est déjà très propre et a une bonne qualité. Rare sont les scripts « perso » aussi bien fais (ou alors peut être ajouter la gestion de l’option -h/–help qui avait déjà était abordée).

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/178 "2016-02-21T03:01:49Z")

</div>

Oui, quand tout sera terminé, j’y penserai.  
Ce soir, je viens d’avoir une coupure de Net ???  
C’est revenu mais avec les orages, on ne sait jamais.  
J’étudie ce qui reste ce soi… nuit 😕  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/179 "2016-02-21T03:01:52Z")

</div>

Remplacé la dernière condition par la fonction ‘sortie\_propre()’ à la fin de laquelle j’ai été obligé d’ajouter un ‘exit’, sinon le script continuait.  
Vérifie bien ce point Michel.  
Remplacé les ‘exit’ par l’appel à cette fonction, y-compris sur le point que tu as soulevé. Tu avais raison, en cas de faute sur le système de fichier, on avait l’alerte mais ça continuait et ça aurait planté, bien sûr.  
Je crois avoir testé toutes les autres possibilités sans avoir rencontré d’erreur.

[code]#!/bin/bash

### BEGIN INIT INFO

# Nom du script : sauvegarde

# Auteur : Ricardo, aidé de l’équipe de ‘[debian-fr.org](http://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

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

# 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](http://debian-fr.org)” nous serait agréable

# Modifié le :

# Objet de la modification :

### END INIT INFO

#----------------- Fonctions ----------------------------  
function test\_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"
	fi  

```

}

function sortie\_propre()  
{

```
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.
	sync
fi

```

exit  
}

#----------------- Variables -------------------  
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 des partitions de sauvegarde et celle du dossier de montage, sinon, on sort avec erreur 1.

```
[-e "${ddext[1]}" ] && [-e "${ddext[2]}" ] || { echo "Le DDext ne répond pas !" >&2; exit 1; } 

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

```

# Choix de la sauvegarde. Si le montage ne s’effectue pas, on sort avec via la fonction ‘sortie\_propre()’

deja\_montee=0  
PS3="Entrez le N° de la sauvegarde choisie : "  
select sauvegarde in “sauve” “sauve2” quitter  
do  
case ${REPLY} in  
[1-2])   
index=${REPLY}  
if ! grep -q “^${ddext[$index]} “$mount\_rep” ${systeme\_fich[$index]}” /etc/mtab  
then  
sudo mount -t “${systeme\_fich[$index]}” “${ddext[$index]}” “$mount\_rep” || sortie\_propre  
break  
else  
printf "Info : La partition ${ddext[$index]} est déjà montée\n"  
deja\_montee=1  
break  
fi  
;;  
3) echo “On sort du script”; sortie\_propre  
;;  
\*) echo “Saisie non valide !”  
;;  
esac  
done

# Teste si la corbeille est pleine (pé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"  
if [-e ~/.local/share/Trash/files/]   
then  
ls ~/.local/share/Trash/files   
read -p "on peut la vider ? o/\* : " corbeille   
if [“$corbeille” = o]  
then  
rm -rf ~/.local/share/Trash/\*  
echo -e "\033[4mCORBEILLE VIDÉE\033[0m"  
fi  
else  
echo "La corbeille est vide"  
fi

# Ordre de sauvegarde faisant appel à la fonction ‘test\_sauvegarde’

read -p "prêt pour la sauvegarde ? o/\* : " onyva  
if [“$onyva” = o]  
then  
for((index=1; index \< ${#controle[@]}; index++))  
do  
test\_sauvegarde “${controle[$index]}” “${exclure[$index]}” “${dossier\_a\_sauver[$index]}” “${sauve[$index]}”   
done  
else  
sortie\_propre  
fi

[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:01 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/180 "2016-02-21T03:01:53Z")

</div>

Un petit détail.

Que ce passe t’il quand la sauvegarde se passe bien ?

Petit trucs cosmétique : la fonction test\_sauvegarde() se content-elle de tester si la sauvegarde s’est bien passée ?

[Page précédente](https://www.debian-fr.org/t/travail-termine-corrections/33195.md?page=8)

[Page suivante](https://www.debian-fr.org/t/travail-termine-corrections/33195.md?page=10)
