scripts shell linux et unix - eyrolles.com · le shell unix . . . . . . . . . . . . . . . . . . . ....

7
Scripts shell Linux et Unix Avec 30 scripts prêts à l’emploi Christophe Blaess 2 e édition © Groupe Eyrolles, 2008, 2012, ISBN : 978-2-212-13579-4

Upload: doannga

Post on 14-Sep-2018

283 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Scriptsshell

Linux et UnixAvec 30 scripts prêts à l’emploi

C h r i s t o p h e B l a e s s

2e édition

© Groupe Eyrolles, 2008, 2012, ISBN : 978-2-212-13579-4

Page 2: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Table des matières

CHAPITRE 1

Principes des scripts shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Pourquoi écrire un script shell ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Outils nécessaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Exécution d’un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Invocation de l’interpréteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Appel direct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Ligne shebang. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

CHAPITRE 2

Programmation shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Premier aperçu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Premier script, rm_secure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Analyse détaillée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Exemple d’exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Shells Livre Page VII Mercredi, 5. septembre 2012 2:23 14

Page 3: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Scripts shell Linux et UnixVIII

CHAPITRE 3

Évaluation d’expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Précisions sur l’opérateur $ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Calcul arithmétique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Invocation de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Portées et attributs des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Paramètres positionnels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Paramètres spéciaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Protection des expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Protection par le caractère backslash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Protection par apostrophes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69Protection par guillemets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

Évaluation explicite d’une expression . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

CHAPITRE 4

Éléments de programmation shell . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Commandes et code de retour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Commande simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Listes de pipelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Commandes composées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Redirections d’entrées-sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

Entrées-sorties standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Redirection des entrées et sorties standards . . . . . . . . . . . . . . . . . . . . . . . . 91Redirections avancées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

Sélection d’instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104Itérations d’instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112Fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Shells Livre Page VIII Mercredi, 5. septembre 2012 2:23 14

Page 4: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Table des matières IX

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

CHAPITRE 5

Commandes, variables et utilitaires système . . . . . . . . . . . . . . . 131

Commandes internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Comportement du shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Exécution des scripts et commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Interactions avec le système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Arguments en ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141Variables internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

Commandes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

CHAPITRE 6

Programmation shell avancée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Processus fils, parallélisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

Arrière-plan et démons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

Signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

Envoi d’un signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Réception d’un signal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165Attente de signaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

Communication entre processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Entrées-sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

tee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171xargs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

Interface utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

stty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174tput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Déboguer un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Virgule flottante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Shells Livre Page IX Mercredi, 5. septembre 2012 2:23 14

Page 5: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Scripts shell Linux et UnixX

CHAPITRE 7

Expressions régulières – Grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Expressions régulières simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180Expressions rationnelles étendues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

Outil grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

Recherche récursive avec find . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

CHAPITRE 8

Sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Utilisation de Sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197Fonctionnement de Sed. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198Commandes Sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

CHAPITRE 9

Awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Fonctionnement de Awk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Les motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214Les actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

Enregistrements et champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

Les enregistrements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Les champs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

Retour sur les affichages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

Shells Livre Page X Mercredi, 5. septembre 2012 2:23 14

Page 6: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Table des matières XI

CHAPITRE 10

Bonne écriture d’un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Présentation générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Ligne shebang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233En-tête du fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Commentaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Indentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Noms des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Utilisation des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Variables des fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

Arguments en ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Codes de retour. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Messages d’erreur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Messages de débogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

En-tête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

ANNEXE A

Scripts complets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

Administration système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

Générateur de mots de passe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Exécution d’un ping vers un ensemble de serveurs . . . . . . . . . . . . . . . . . . 244Supervision distante d’un petit parc de machines . . . . . . . . . . . . . . . . . . . 245Image de l’activité système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Synchronisation de répertoires distants . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

Fichiers et bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

Sauvegarde quotidienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252Renommage d’un ensemble de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Scan et archivage de documents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Création d’une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256Consultation d’une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

Shells Livre Page XI Mercredi, 5. septembre 2012 2:23 14

Page 7: Scripts shell Linux et Unix - eyrolles.com · Le shell Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 ... Exercices ... 160

Scripts shell Linux et UnixXII

Scripts divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

Calcul de prix et de TVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258Générateur aléatoire suivant une loi normale . . . . . . . . . . . . . . . . . . . . . . . 260Calcul et affichage d’histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Préparation d’un script d’installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264Présentation d’un fichier script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

ANNEXE B

QCM d’évaluation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

Énoncés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

ANNEXE C

Solutions des exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

Chapitre 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

Chapitre 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

Chapitre 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

Chapitre 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Chapitre 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

Chapitre 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Chapitre 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

ANNEXE D

Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

Livres et articles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

Sites de référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

Norme Single UNIX Specification Version 3 . . . . . . . . . . . . . . . . . . . . . . 290Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Korn shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Pdksh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Tcsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Zsh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Sed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

Shells Livre Page XII Mercredi, 5. septembre 2012 2:23 14