Programmation shell sous Unix/Linux - ksh, bash, norme POSIX
Editions Eni
Avant-propos
Chapitre 1
Introduction
1. Définition du shell21
2. Caractéristiques d'un interpréteur de commandes21
3. Interpréteurs de commandes (shells)22
3.1 Historique22
3.2 Avec quel shell faut-il programmer ?24
3.3 Nom des exécutables à invoquer25
4. Shells abordés dans cet ouvrage26
Chapitre 2
Mécanismes essentiels du shell
1. Présentation29
2. Commandes internes et externes29
2.1 Les commandes externes29
2.2 Les commandes internes31
2.3 Implémentation interne et implémentation externe32
3. Affichage à l'écran34
3.1 La commande echo34
3.1.1 Le caractère \n35
3.1.2 Le caractère \c35
3.1.3 Le caractère \t36
3.2 Les commandes print et printf36
4. Le caractère ~ (tilde)37
5. La commande interne cd38
6. Substitution de noms de fichiers39
6.1 Expressions basiques39
6.1.1 Le caractère *39
6.1.2 Le caractère ?39
6.1.3 Les caractères [ ]40
6.2 Expressions étendues42
6.2.1 ?(expression)43
6.2.2 *(expression)43
6.2.3 +(expression)43
6.2.4 @(expression)44
6.2.5 !(expression)44
6.2.6 Alternatives44
6.3 Interprétation du shell45
7. Séparateur de commandes46
8. Redirections47
8.1 Entrée et sorties standards des processus47
8.1.1 Entrée standard47
8.1.2 Sortie standard47
8.1.3 Sortie d'erreur standard48
8.2 Héritage48
8.3 Redirection des sorties en écriture49
8.3.1 Sortie standard49
8.3.2 Sortie d'erreur standard50
8.3.3 Sortie standard et sortie d'erreur standard51
8.3.4 Se protéger d'un écrasement involontaire de fichier52
8.3.5 Éliminer les affichages53
8.3.6 Mécanisme interne53
8.4 Redirection de l'entrée standard54
8.5 Rediriger les descripteurs 1 et 2 vers le même fichier56
8.6 La double redirection en lecture57
8.7 Fermeture d'un descripteur58
9. Tubes de communication59
9.1 Commandes ne lisant pas leur entrée standard61
9.2 Commandes lisant leur entrée standard61
9.2.1 Exemples triviaux61
9.2.2 Cas des filtres62
9.3 Compléments66
9.3.1 Enchaîner des tubes66
9.3.2 Dupliquer les sorties66
9.3.3 Envoyer la sortie standard et la sortie d'erreur standard dans le tube67
10. Regroupement de commandes68
10.1 Les parenthèses68
10.2 Les accolades69
10.3 Conclusion70
11. Processus en arrière-plan71
11.1 Principe71
11.2 Contrôle de tâches (jobs)72
12. Exercices74
12.1 Fonctionnalités diverses74
12.1.1 Exercice 1 : commandes internes et externes74
12.1.2 Exercice 2 : génération de noms de fichiers74
12.1.3 Exercice 3 : séparateur de commandes75
12.2 Redirections75
12.2.1 Exercice 175
12.2.2 Exercice 275
12.2.3 Exercice 375
12.2.4 Exercice 476
12.2.5 Exercice 576
12.2.6 Exercice 676
12.3 Tubes de communication76
12.3.1 Exercice 176
12.3.2 Exercice 276
12.3.3 Exercice 376
12.3.4 Exercice 477
Chapitre 3
Paramétrage de l'environnement de travail
1. Présentation79
2. Variables d'environnement79
2.1 Liste des variables79
2.2 Affichage de la valeur d'une variable80
2.3 Modification de la valeur d'une variable80
2.4 Principales variables81
2.4.1 HOME81
2.4.2 PATH81
2.4.3 PWD83
2.4.4 PS183
2.4.5 PS287
2.4.6 SHELL87
2.4.7 TMOUT88
2.4.8 TERM88
2.4.9 LOGNAME88
2.4.10 BASHOPTS88
2.5 Processus et variables d'environnement89
2.6 Exportation des variables du shell89
2.6.1 Liste des variables exportées89
2.6.2 Variables devant être exportées90
2.6.3 Exporter une variable91
3. Les options du shell94
3.1 Activer et désactiver une option du shell94
3.2 Visualiser la liste des options94
3.3 Principales options95
3.3.1 ignoreeof95
3.3.2 noclobber95
3.3.3 emacs et vi96
3.3.4 xtrace96
4. Les alias97
4.1 Définir un alias97
4.2 Visualiser la liste des alias97
4.2.1 Visualiser tous les alias97
4.2.2 Visualiser un alias en particulier98
4.3 Supprimer un alias98
5. Historique de commandes98
5.1 Paramétrer le rappel de commandes en ksh99
5.1.1 Option vi99
5.1.2 Option emacs101
5.2 Paramétrer le rappel de commandes en bash105
5.3 La complétion de noms de fichiers105
5.3.1 La complétion du bash105
5.3.2 La complétion du ksh106
5.3.3 Tableau récapitulatif108
5.4 Autres complétions108
6. Les fichiers d'environnement109
6.1 Caractéristiques des fichiers d'environnement109
6.1.1 Shell de connexion109
6.1.2 Fichiers d'environnement lus par le shell de connexion110
6.2 Session utilisant un Korn shell113
6.3 Session utilisant un Bourne Again shell116
6.4 Session utilisant un Bourne shell118
7. Exercices119
7.1 Variables d'environnement119
7.1.1 Exercice 1119
7.1.2 Exercice 2119
7.2 Alias de commandes120
7.2.1 Exercice 1120
7.2.2 Exercice 2120
Chapitre 4
Les bases de la programmation shell
1. Présentation121
2. Les variables utilisateur121
2.1 Nommer une variable121
2.2 Définir une variable122
2.2.1 Affecter une valeur à une variable122
2.2.2 Affecter une valeur contenant au moins un espace122
2.2.3 Variable indéfinie123
2.2.4 Retirer la définition d'une variable123
2.2.5 Isoler le nom d'une variable124
2.2.6 Variables numériques125
2.2.7 Variables complexes126
2.2.8 Variables accessibles en lecture seule126
2.3 Substitution de variables127
3. Substitution de commandes129
4. Caractères de protection131
4.1 Les apostrophes (simples quotes)131
4.2 Le caractère\132
4.3 Les guillemets133
5. Récapitulatif des caractères spéciaux134
6. Interprétation d'une ligne de commande134
7. Écriture et lancement d'un script shell135
7.1 Définition135
7.2 Exécution d'un script par un shell enfant136
7.3 Exécution d'un script par le shell courant139
7.4 Commentaires141
8. Variables réservées du shell142
8.1 Les paramètres positionnels142
8.2 La commande shift144
8.2.1 Syntaxe144
8.2.2 Principe144
8.3 Code de retour d'une commande146
8.3.1 La variable $?146
8.3.2 La commande exit147
8.4 Autres variables spéciales148
8.4.1 PID du shell interpréteur148
8.4.2 PID du dernier processus lancé en arrière-plan149
9. La commande read151
9.1 Syntaxe151
9.2 Lectures au clavier151
9.3 Code de retour153
9.4 La variable IFS154
10. Exécution de tests155
10.1 Introduction155
10.2 La commande [[ ]]155
10.2.1 Syntaxes156
10.2.2 Tests sur les fichiers157
10.2.3 Tests sur les chaînes de caractères159
10.2.4 Tests numériques162
10.2.5 Les opérateurs163
10.2.6 Exemple concret d'utilisation164
10.3 La commande [ ] (commande test)164
10.3.1 Syntaxe165
10.3.2 Tests sur les fichiers165
10.3.3 Tests sur les chaînes de caractères168
10.3.4 Tests sur les nombres170
10.3.5 Les opérateurs logiques171
10.3.6 Exemple concret d'utilisation172
11. Les opérateurs du shell172
11.1 Évaluation de l'opérateur &&173
11.2 Évaluation de l'opérateur | |174
11.3 Inverser le code de retour d'une commande175
12. L'arithmétique176
12.1 La commande (( ))176
12.1.1 Syntaxe176
12.1.2 Opérateurs177
12.2 La commande let179
12.3 La commande expr180
12.3.1 Syntaxe180
12.3.2 Opérateurs180
13. Substitution d'expressions arithmétiques183
14. Arithmétique sur les flottants185
14.1 ksh93185
14.2 Autres shells185
15. Mise au point d'un script186
15.1 Option -x186
15.2 Autres options189
16. Les structures de contrôle189
16.1 if189
16.2 case193
16.2.1 Syntaxe193
16.2.2 Principe194
16.2.3 Utilisation195
16.3 Boucle for199
16.3.1 Syntaxe classique199
16.3.2 Autre syntaxe203
16.4 Boucle while204
16.4.1 Syntaxe204
16.4.2 Utilisation205
16.4.3 Boucle infinie206
16.5 until208
16.5.1 Syntaxe208
16.5.2 Utilisation209
16.6 break et continue213
17. Exercices215
17.1 Variables, caractères spéciaux215
17.1.1 Exercice 1 : variables215
17.1.2 Exercice 2 ; variables216
17.1.3 Exercice 3 : substitution de commande216
17.1.4 Exercice 4 : caractères de protection216
17.2 Variables, affichages et lectures clavier217
17.2.1 Exercice 1 : variables217
17.2.2 Exercice 2 : paramètres positionnels217
17.2.3 Exercice 3 : lectures clavier217
17.3 Tests et arithmétique218
17.3.1 Exercice 1 : tests sur des fichiers218
17.3.2 Exercice 2 : tests de chaînes de caractères218
17.3.3 Exercice 3 ; tests numériques219
17.3.4 Exercice 4 : arithmétique219
17.3.5 Exercice 5 : opérateurs logiques des commandes [ ] et [[ ]] et opérateurs logiques du shell219
17.4 Structures de contrôle if, case, boucle for220
17.4.1 Exercice 1 : les commandes [ ] et [[ ]], la structure de contrôle if220
17.4.2 Exercice 2 ; structures de contrôle case, boucle for220
17.5 Boucles221
17.5.1 Exercice 1 : boucle for, commande tr221
17.5.2 Exercice 2 : boucle for, arithmétique221
17.5.3 Exercice 3 ; boucles for, while222
Chapitre 5
Aspects avancés de la programmation shell
1. Présentation223
2. Comparatif des variables $* et $@223
2.1 Utilisation de $* et de $@ sans guillemets223
2.2 Utilisation de "$*" entre guillemets225
2.3 Utilisation de "$@" entre guillemets226
3. Manipulation de variables227
3.1 Longueur de la valeur contenue dans une variable227
3.2 Retirer le plus petit fragment en début de chaîne227
3.3 Retirer le plus grand fragment en début de chaîne228
3.4 Retirer le plus petit fragment en fin de chaîne228
3.5 Retirer le plus grand fragment en fin de chaîne229
4. Tableaux indicés numériquement230
4.1 Définition et initialisation d'un tableau230
4.2 Assigner un élément de tableau231
4.3 Valeur d'un élément232
4.4 Référencer tous les éléments d'un tableau232
4.5 Obtenir le nombre d'éléments d'un tableau232
4.6 Obtenir la longueur d'un élément d'un tableau233
4.7 Parcourir un tableau indicé numériquement233
5. Tableaux associatifs235
5.1 Définition et initialisation d'un tableau associatif235
5.2 Afficher la valeur associée à une clé236
5.3 Afficher la liste des clés236
5.4 Afficher la liste des valeurs236
5.5 Boucler sur un tableau associatif237
6. Initialisation des paramètres positionnels avec set237
7. Les fonctions238
7.1 Définition d'une fonction238
7.2 Code de retour d'une fonction240
7.3 Portée des variables242
7.4 Définition de variables locales243
7.5 Passage d'arguments244
7.6 Variable référence246
7.7 Exploiter l'affichage d'une fonction248
8. Commandes d'affichage250
8.1 La commande print250
8.1.1 Utilisation simple250
8.1.2 Suppression du saut de ligne naturel de print250
8.1.3 Afficher des arguments commençant par le caractère250
8.1.4 Écrire sur un descripteur particulier251
8.2 La commande printf251
9. Gestion des entrées/sorties d'un script253
9.1 Redirection des entrées/sorties standards253
9.2 Gestion de fichiers257
9.2.1 Descripteurs de fichiers257
9.2.2 Ouverture de fichier257
9.2.3 Lecture à partir d'un fichier ouvert257
9.2.4 Écriture dans un fichier ouvert257
9.2.5 Fermeture d'un fichier258
9.3 Traitement d'un fichier260
9.3.1 Informations préalables260
9.3.2 Les différentes façons d'exploiter un fichier260
9.3.3 Découper une ligne en champs265
9.3.4 Lire plusieurs lignes avec un appel à read266
9.3.5 Modifier le séparateur de ligne267
10. La commande eval268
11. Gestion des signaux271
11.1 Principaux signaux271
11.2 Ignorer un signal272
11.3 Modifier le traitement associé à un signal273
11.4 Repositionner le traitement par défaut du shell vis-à-vis d'un signal274
11.5 Utiliser trap à partir d'un script shell275
12. Gestion de menus avec select276
13. Analyse des options d'un script avec getopts278
14. Gestion d'un processus en arrière-plan284
15. Compatibilité d'un script entre bash et ksh285
15.1 Récupérer le nom du shell interpréteur du script285
15.2 Gestion des séquences d'échappement avec echo286
15.3 Gestion des caractères étendus287
15.4 Script complet287
16. Script d'archivage incrémental et transfert SFTP automatique288
16.1 Objectif288
16.2 Le fichier uploadBackup.sh291
16.3 Le fichier fonctions.inc.sh294
17. Exercices297
17.1 Fonctions297
17.1.1 Exercice 1 : fonctions simples297
17.1.2 Exercice 2 : fonctions simples, statut de retour298
17.1.3 Exercice 3 : passage de paramètres, retour de valeur299
17.1.4 Exercice 4 ; fichiers300
17.1.5 Exercice 5 : fichiers, fonctions, menu select301
17.1.6 Exercice 6 : fichiers, tableaux associatifs (bash 4, ksh93)302
Chapitre 6
Les expressions régulières
1. Présentation303
2. Caractères communs aux ERb et ERe304
3. Caractères spécifiques aux ERb307
4. Caractères spécifiques aux ERe308
5. Exploitation des expressions régulières par les commandes310
5.1 La commande vi310
5.2 La commande grep310
5.3 La commande expr312
5.4 sed et awk316
6. Exercices316
6.1 Expressions régulières316
6.1.1 Exercice 1 : expressions régulières avec vi316
6.1.2 Exercice 2 : grep317
Chapitre 7
La commande sed
1. Présentation319
2. Utilisation de la commande sed319
3. Exemples322
3.1 Utilisation de sed en ligne de commande322
3.1.1 La commande d (delete)322
3.1.2 La commande p (print)323
3.1.3 La commande w (write)324
3.1.4 Négation d'une commande (!)324
3.1.5 La commande s (substitution)325
3.2 Script sed327
4. Exercices328
4.1 Expressions régulières328
4.1.1 Exercice 1 : insertion de balises dans un fichier328
4.1.2 Exercice 2. : formatage de fichier329
Chapitre 8
Le langage de programmation awk
1. Présentation331
1.1 Syntaxe331
1.2 Version de gawk332
1.3 Variables spéciales332
1.3.1 Variables prédéfinies dès le lancement de awk332
1.3.2 Variables initialisées lors du traitement d'une ligne333
1.3.3 Exemples simples334
1.4 Critères de sélection336
1.4.1 Expressions régulières336
1.4.2 Tests logiques337
1.4.3 Intervalles de lignes338
1.5 Structure d'un script awk339
1.5.1 BEGIN339
1.5.2 Sections intermédiaires339
1.5.3 END339
1.5.4 Commentaires339
1.5.5 Variables339
1.5.6 Exemple340
2. Opérateurs341
3. La fonction printf343
4. Redirections345
5. Lecture de la ligne suivante : next347
6. Structures de contrôle348
6.1 if348
6.2 switch348
6.3 for350
6.4 while351
6.5 do-while351
6.6 break351
6.7 continue351
7. Terminer un script352
8. Tableaux352
8.1 Tableaux indicés par un nombre352
8.2 Tableaux indicés par une chaîne de caractères353
8.3 Tester l'existence d'un élément355
8.4 Supprimer un élément356
8.5 Nombre d'éléments d'un tableau357
8.6 Ordre de parcours des éléments357
8.7 Trier un tableau360
9. Tableaux multidimensionnels362
9.1 Simulation de tableaux multidimensionnels362
9.2 Vrais tableaux multidimensionnels364
9.3 Tester si une variable est un tableau365
10. Les arguments de la ligne de commande366
11. Fonctions intégrées368
11.1 Fonctions travaillant sur les chaînes368
11.2 Fonctions mathématiques369
11.3 Fonctions liées aux tableaux370
11.4 Autres fonctions370
11.4.1 La fonction getline370
11.4.2 La fonction close374
11.4.3 La fonction system375
12. Fonctions utilisateur376
13. Inclusions de fichiers377
14. Exercices379
14.1 awk en ligne de commande379
14.1.1 Exercice 1 : awk et autres filtres379
14.1.2 Exercice 2 : critères de sélection379
14.1.3 Exercice 3 : critères de sélection, affichage de champs, sections BEGIN et END380
14.2 Scripts awk381
14.2.1 Exercice 4 : fonctions381
14.2.2 Exercice 5 : analyse d'un fichier de log383
14.2.3 Exercice 6 : génération d'un fichier d'étiquettes384
Chapitre 9
Les commandes filtres
1. Présentation385
2. Syntaxe d'appel des commandes filtres385
3. Visualisation de données386
3.1 Consultation de données, création de fichiers : cat386
3.2 Valeur des octets d'un flux de données : od387
3.3 Filtrage de lignes : grep388
3.4 Dernières lignes d'un flux de données : tail392
3.5 Premières lignes d'un flux de données : head393
3.6 Duplication de la sortie standard : tee394
3.7 Numérotation de lignes : nl394
3.8 Présentation d'un flux de données : pr395
4. Traitement de données397
4.1 Comptage de lignes, de mots et de caractères : wc397
4.2 Extraction de caractères : cut399
4.3 Tri de données : sort401
4.4 paste403
4.5 split405
4.6 Transformation de caractères : tr406
4.7 Dédoublonnage : uniq408
5. Compressions, archivages et conversions409
5.1 Compressions : gzip, bzip2409
5.2 Archives tar411
5.3 Archives cpio413
5.4 Copie physique, transformations : dd415
5.5 Changement d'encodage : iconv417
6. Commandes réseau sécurisées418
6.1 Connexion à distance : ssh418
6.2 Transfert de fichier : sftp419
6.2.1 Commandes de sftp s'exécutant sur la machine locale420
6.2.2 Commandes s'exécutant sur la machine distante421
6.2.3 Commandes de transfert422
6.2.4 Connexion automatique sans mot de passe423
7. Autres commandes425
7.1 La commande xargs425
7.2 Comparer deux fichiers : cmp427
7.3 Lignes communes à deux fichiers : comm429
Chapitre 10
Comment faire... (synthèse)
1. Présentation431
2. Informations431
3. Modèles de noms de fichiers432
4. Tester le code retour d'une commande433
5. Test d'égalité entre deux chaînes434
6. Test d'inégalité entre deux chaînes435
7. Correspondance d'une variable par rapport à un modèle436
8. Non-correspondance d'une variable par rapport à un modèle437
9. Retirer le début ou la fin d'une chaîne438
10. Calculer la longueur d'une chaîne440
11. Récupérer le champ d'une ligne441
12. Ne pas afficher certaines lignes d'un flux443
13. Tests numériques444
14. Calculs445
15. Lancer un script d'un autre langage à partir d'un shell446
16. Accéder à une base MySQL à partir d'un shell447
Chapitre 11
Compléments sur les mécanismes internes du shell
1. Présentation449
2. Redirection des descripteurs 1 et 2 vers le même fichier449
3. Regroupement de commandes avec les parenthèses454
4. Regroupement de commandes avec les accolades458
5. Interprétation d'un script par un shell enfant461
Chapitre 12
Annexes
1. Caractères spéciaux du shell465
2. Commandes internes au shell466
3. Classes de caractères POSIX469
4. Ordre d'interprétation d'une commande470
Chapitre 13
Solutions des exercices
1. Solutions du chapitre Mécanismes essentiels du shell471
1.1 Fonctionnalités diverses471
1.1.1 Exercice 1 : commandes internes et externes471
1.1.2 Exercice 2 : génération de noms de fichiers471
1.1.3 Exercice 3 : séparateur de commandes473
1.2 Redirections473
1.2.1 Exercice 1473
1.2.2 Exercice 2473
1.2.3 Exercice 3474
1.2.4 Exercice 4474
1.2.5 Exercice 5474
1.2.6 Exercice 6474
1.3 Tubes de communication475
1.3.1 Exercice 1475
1.3.2 Exercice 2475
1.3.3 Exercice 3475
1.3.4 Exercice 4475
2. Solutions du chapitre Paramétrage de l'environnement de travail476
2.1 Variables d'environnement476
2.1.1 Exercice 1476
2.1.2 Exercice 2476
2.2 Alias de commandes477
2.2.1 Exercice 1477
2.2.2 Exercice 2478
3. Solutions du chapitre Les bases de la programmation shell479
3.1 Variables, caractères spéciaux479
3.1.1 Exercice 1 : variables479
3.1.2 Exercice 2 : variables479
3.1.3 Exercice 3 : substitution de commande480
3.1.4 Exercice 4 ; caractères de protection480
3.2 Variables, affichages et lectures clavier481
3.2.1 Exercice 1 : variables481
3.2.2 Exercice 2 : paramètres positionnels482
3.2.3 Exercice 3 : lectures clavier483
3.3 Tests et arithmétique484
3.3.1 Exercice 1 : tests sur des fichiers484
3.3.2 Exercice 2 : tests de chaînes de caractères485
3.3.3 Exercice 3 ; tests numériques486
3.3.4 Exercice 4 : arithmétique487
3.3.5 Exercice 5 : opérateurs logiques des commandes [ ] et [[ ]] et opérateurs logiques du shell488
3.4 Structures de contrôle if, case, boucle for489
3.4.1 Exercice 1 : les commandes [ ] et [[ ]], la structure de contrôle if489
3.4.2 Exercice 2 : structures de contrôle case, boucle for490
3.5 Boucles491
3.5.1 Exercice 1 : boucle for, commande tr491
3.5.2 Exercice 2 : boucle for, arithmétique492
3.5.3 Exercice 3 : boucles for, while493
4. Solutions du chapitre Aspects avancés de la programmation shell.494
4.1 Fonctions494
4.1.1 Exercice 1 : fonctions simples494
4.1.2 Exercice 2 : fonctions simples, statut de retour496
4.1.3 Exercice 3 : passage de paramètres, retour de valeur497
4.1.4 Exercice 4 ; fichiers499
4.1.5 Exercice 5 : fichiers, fonctions, menu select500
4.1.6 Exercice 6 : fichiers, tableaux associatifs (bash 4, ksh93)502
5. Solutions du chapitre Les expressions régulières503
5.1 Expressions régulières503
5.1.1 Exercice 1 : expressions régulières avec vi503
5.1.2 Exercice 2 : grep505
6. Solutions du chapitre La commande sed506
6.1 Expressions régulières506
6.1.1 Exercice 1 : insertion de balises dans un fichier506
6.1.2 Exercice 2 : formatage de fichier507
7. Solution du chapitre Le langage de programmation awk508
7.1 awk en ligne de commande508
7.1.1 Exercice 1 : awk et autres filtres508
7.1.2 Exercice 2 : critères de sélection508
7.1.3 Exercice 3 ; critères de sélection, affichage de champs, sections BEGIN et END509
7.2 Scripts awk510
7.2.1 Exercice 4 : fonctions510
7.2.2 Exercice 5 : analyse d'un fichier de log512
7.2.3 Exercice 6 : génération d'un fichier d'étiquettes513
Index517