Guide avancé d'écriture des scripts Bash

Une exploration en profondeur de l'art de la programmation shell

Mendel Cooper

6.3.14

13 Jul 2011

Historique des versions
Version 6.1 30 Sep 2009 mc
Version 'BUFFALOBERRY' : Mise à jour mineure.
Version 6.2 17 Mar 2010 mc
Version 'ROWANBERRY'
Version 6.3 27 Apr 2011 mc
Version 'SWOZZLEBERRY'
Version 6.3fr 19 juillet 2011 ob
Mise à jour de la traduction française.

Résumé

Ce tutoriel ne suppose aucune connaissance de la programmation de scripts, mais permet une progression rapide vers un niveau intermédiaire/avancé d'instruction tout en se plongeant dans de petites pépites du royaume d'UNIX®. Il est utile comme livre, comme manuel permettant d'étudier seul, et comme référence et source de connaissance sur les techniques de programmation de scripts. Les exercices et les exemples grandement commentés invitent à une participation active du lecteur avec en tête l'idée que la seule façon pour vraiment apprendre la programmation de scripts est d'écrire des scripts.

Ce livre est adapté à une utilisation en classe en tant qu'introduction générale aux concepts de la programmation.


À Anita, source de toute magie

Table des matières

1ère Partie. Introduction
1. Pourquoi programmer en Shell ?
2. Le lancement avec « #! »
2.1. Appel du script
2.2. Exercices préliminaires
2ème Partie. Bases
3. Caractères spéciaux
4. Introduction aux variables et aux paramètres
4.1. Substitution de variable
4.2. Affectation de variable
4.3. Les variables Bash ne sont pas typées
4.4. Types de variables spéciales
5. Guillemets et apostrophes
5.1. Placer les variables entre guillemets
5.2. Échappement
6. Sortie et code de sortie (ou d'état)
7. Tests
7.1. Contrôles de test
7.2. Opérateurs de test de fichiers
7.3. Autres opérateurs de comparaison
7.4. Tests if/then imbriqués
7.5. Tester votre connaissance des tests
8. Opérations et sujets en relation
8.1. Opérateurs
8.2. Constantes numériques
8.3. Les expressions entre doubles parenthèses
8.4. Précédence des opérateurs
3ème Partie. Après l'approche basique
9. Nouveau regard sur les variables
9.1. Les variables internes
9.2. Typer des variables : declare ou typeset
9.3. $RANDOM : générer un entier aléatoire
10. Manipulating Variables
10.1. Manipuler les chaînes de caractères
10.2. Substitution de paramètres
11. Boucles et branchements
11.1. Boucles
11.2. Boucles imbriquées
11.3. Contrôle des boucles
11.4. Tests et branchements
12. Substitution de commandes
13. Expansion arithmétique
14. Récréation
4ème Partie. Commandes
15. Commandes internes et intégrées
15.1. Commandes de contrôle des jobs
16. Filtres externes, programmes et commandes
16.1. Commandes de base
16.2. Commandes complexes
16.3. Commandes de date et d'heure
16.4. Commandes d'analyse de texte
16.5. Commandes pour les fichiers et l'archivage
16.6. Commandes de communications
16.7. Commandes de contrôle du terminal
16.8. Commandes mathématiques
16.9. Commandes diverses
17. Commandes système et d'administration
17.1. Analyser un script système
5ème Partie. Thèmes avancés
18. Expressions rationnelles
18.1. Une brève introduction aux expressions rationnelles
18.2. Remplacement
19. Documents intégrés
19.1. Chaînes en ligne
20. Redirection d'E/S (entrées/sorties)
20.1. Utiliser exec
20.2. Rediriger les blocs de code
20.3. Applications
21. Sous-shells
22. Shells restreints
23. Substitution de processus
24. Fonctions
24.1. Fonctions complexes et complexité des fonctions
24.2. Variables locales
24.3. Récursion sans variables locales
25. Alias
26. Constructeurs de listes
27. Tableaux
28. Références indirectes
29. /dev et /proc
29.1. /dev
29.2. /proc
30. Programmation réseau
31. Des Zéros et des Nuls
32. Débogage
33. Options
34. Pièges
35. Écrire des scripts avec style
35.1. Feuille de style non officielle d'écriture de scripts
36. Divers
36.1. Shells et scripts interactifs et non interactifs
36.2. Scripts d'appel
36.3. Tests et comparaisons : alternatives
36.4. Récursion : un script s'appelant lui-même
36.5. « Coloriser » les scripts
36.6. Optimisations
36.7. Astuces assorties
36.8. Problèmes de sécurité
36.9. Problèmes de portabilité
36.10. Scripts sous Windows
37. Bash, versions 2, 3 et 4
37.1. Bash, version 2
37.2. Bash, version 3
37.3. Bash, version 4
38. Notes finales
38.1. Note de l'auteur
38.2. À propos de l'auteur
38.3. Où trouver de l'aide
38.4. Outils utilisés pour fabriquer ce livre
38.5. Remerciements
38.6. Limitation de responsabilité
Bibliographie
A. Contribution de scripts
B. Fiches de référence
C. Petit guide sur Sed et Awk
C.1. Sed
C.2. Awk
D. Codes de sortie ayant une signification particulière
E. Une introduction détaillée sur les redirections d'entrées/sorties
F. Options en ligne de commande
F.1. Options standards en ligne de commande
F.2. Options en ligne de commande de Bash
G. Fichiers importants
H. Répertoires système importants
I. An Introduction to Programmable Completion
J. Localisation
K. Commandes d'historique
L. Exemples de fichiers .bashrc et .bash_profile
M. Convertir des fichiers batch DOS en scripts shell
N. Exercices
N.1. Analyse de scripts
N.2. Écriture de scripts
O. Historique des révisions
P. Sites de téléchargement, miroirs
Q. Liste de choses à faire
R. Droits d'utilisation
S. Copyright
T. Table ASCII
U. Index

Liste des tableaux

8.1. Précédence des opérateurs
15.1. Identifiants de jobs
33.1. Options de bash
36.1. Nombres représentant les couleurs des séquences d'échappement
B.1. Variables spéciales du shell
B.2. Opérateurs de test : comparaison binaire
B.3. Opérateurs de test : fichiers
B.4. Substitution et expansion de paramètres
B.5. Opérations sur les chaînes
B.6. Syntaxes diverses
C.1. Opérateurs sed basiques
C.2. Exemples d'opérateurs sed
D.1. Codes de sortie réservés
M.1. Mots clés / variables / opérateurs des fichiers batch, et leur équivalent shell
M.2. Commandes DOS et leur équivalent UNIX
O.1. Historique des révisions

Liste des exemples

2.1. cleanup : Un script pour nettoyer les journaux de trace dans /var/log
2.2. cleanup : Un script de nettoyage amélioré
2.3. cleanup : Une version améliorée et généralisée des scripts précédents
3.1. Blocs de code et redirection d'entrées/sorties
3.2. Sauver la sortie d'un bloc de code dans un fichier
3.3. Exécuter une boucle en tâche de fond
3.4. Sauvegarde de tous les fichiers modifiés dans les dernières 24 heures
4.1. Affectation de variable et substitution
4.2. Affectation basique de variable
4.3. Affectation de variable, basique et élaborée
4.4. Entier ou chaîne ?
4.5. Paramètres positionnels
4.6. wh, recherche d'un nom de domaine avec whois
4.7. Utiliser shift
5.1. Afficher des variables bizarres
5.2. Caractères d'échappement
5.3. Détecte les pressions du clavier
6.1. exit / code de sortie
6.2. Inverser une condition en utilisant !
7.1. Où est la vérité ?
7.2. Équivalences de test, /usr/bin/test, [ ], et /usr/bin/[
7.3. Tests arithmétiques en utilisant (( ))
7.4. Test de liens cassés
7.5. Comparaisons de nombres et de chaînes de caractères
7.6. Vérification si une chaîne est vide
7.7. zmore
8.1. Plus grand diviseur commun
8.2. Utiliser des opérations arithmétiques
8.3. Tests de conditions composées en utilisant && et ||
8.4. Représentation des constantes numériques
8.5. Manipulation de variables à la manière de C.
9.1. $IFS et espaces blancs
9.2. Saisie avec délai
9.3. Encore une fois, saisie avec délai
9.4. Lecture avec délai
9.5. Suis-je root ?
9.6. arglist : Affichage des arguments avec $* et $@
9.7. Comportement de $* et $@ incohérent
9.8. $* et $@ lorsque $IFS est vide
9.9. Variable tiret bas
9.10. Utiliser declare pour typer des variables
9.11. Générer des nombres aléatoires
9.12. Piocher une carte au hasard dans un tas
9.13. Simulation « Brownian Motion »
9.14. Un nombre au hasard entre deux valeurs
9.15. Lancement d'un seul dé avec RANDOM
9.16. Réinitialiser RANDOM
9.17. Nombres pseudo-aléatoires, en utilisant awk
10.1. Insérer une ligne blanche entre les paragraphes d'un fichier texte
10.2. Générer « de manière aléatoire » une chaîne de huit caractères
10.3. Convertir des formats de fichiers graphiques avec une modification du nom du fichier
10.4. Convertir des fichiers audio en ogg
10.5. Émuler getopt
10.6. Autres moyens pour extraire ou situer des sous-chaînes
10.7. Utiliser la substitution et les messages d'erreur
10.8. Substitution de paramètres et messages d'« usage »
10.9. Longueur d'une variable
10.10. Correspondance de modèle dans la substitution de paramètres
10.11. Renommer des extensions de fichiers :
10.12. Utiliser la concordance de modèles pour analyser des chaînes de caractères diverses
10.13. Modèles correspondant au préfixe ou au suffixe d'une chaîne de caractères
11.1. Des boucles for simples
11.2. Boucle for avec deux paramètres dans chaque élément de la [liste]
11.3. Fileinfo : opérer sur une liste de fichiers contenue dans une variable
11.4. Agir sur des fichiers à l'aide d'une boucle for
11.5. in [liste] manquant dans une boucle for
11.6. Générer la [liste] dans une boucle for avec la substitution de commandes
11.7. Un remplaçant de grep pour les fichiers binaires
11.8. Afficher tous les utilisateurs du système
11.9. Rechercher les auteurs de tous les binaires d'un répertoire
11.10. Afficher les liens symboliques dans un répertoire
11.11. Liens symboliques dans un répertoire, sauvés dans un fichier
11.12. Une boucle for comme en C
11.13. Utiliser efax en mode batch
11.14. Simple boucle while
11.15. Une autre boucle while
11.16. Boucle while avec de multiples conditions
11.17. Syntaxe à la C pour une boucle while
11.18. Boucle until
11.19. Boucles imbriquées
11.20. Effets de break et continue dans une boucle
11.21. Sortir de plusieurs niveaux de boucle
11.22. Continuer à un plus haut niveau de boucle
11.23. Utiliser continue N dans une tâche courante
11.24. Utiliser case
11.25. Créer des menus en utilisant case
11.26. Utiliser la substitution de commandes pour générer la variable case
11.27. Simple correspondance de chaîne
11.28. Vérification d'une entrée alphabétique
11.29. Créer des menus en utilisant select
11.30. Créer des menus en utilisant select dans une fonction
12.1. Trucs de script stupides
12.2. Générer le contenu d'une variable à partir d'une boucle
12.3. Découvrir des anagrammes
15.1. Un script qui engendre plusieurs instances de lui-même
15.2. printf en action
15.3. Affectation d'une variable, en utilisant read
15.4. Qu'arrive-t'il quand read n'a pas de variable
15.5. Lecture de plusieurs lignes par read
15.6. Détecter les flèches de direction
15.7. Utiliser read avec la redirection de fichier
15.8. Problèmes lors de la lecture d'un tube
15.9. Modifier le répertoire courant
15.10. Laisser let faire un peu d'arithmétique.
15.11. Montrer l'effet d'eval
15.12. Utilisation de eval pour sélectionner des variables
15.13. Afficher les paramètres en ligne de commande
15.14. Forcer une déconnexion
15.15. Une version de rot13
15.16. Utiliser set avec les paramètres de position
15.17. Inverser les paramètres de position
15.18. Réaffecter les paramètres de position
15.19. « Dés-assigner » une variable
15.20. Utiliser export pour passer une variable à un script awk embarqué
15.21. Utiliser getopts pour lire les options/arguments passés à un script
15.22. « Inclure » un fichier de données
15.23. Un script (inutile) qui se charge lui-même
15.24. Effets d'exec
15.25. Un script lançant exec sur lui-même
15.26. Attendre la fin d'un processus avant de continuer
15.27. Un script qui se tue lui-même
16.1. Utilisation de ls pour créer une liste de fichiers à graver sur un CDR
16.2. Hello or Good-bye
16.3. Badname élimine dans le répertoire courant les fichiers dont le nom contient des caractères incorrects et des espaces blancs.
16.4. Effacer un fichier par son numéro d'inode
16.5. Fichier de traces utilisant xargs pour surveiller les journaux système
16.6. Copier les fichiers du répertoire courant vers un autre répertoire en utilisant xargs
16.7. Tuer des processus par leur nom
16.8. Analyse de la fréquence des mots en utilisant xargs
16.9. Utiliser expr
16.10. Utiliser date
16.11. Calcul de Date
16.12. Analyse de fréquence d'apparition des mots
16.13. Quels fichiers sont des scripts ?
16.14. Générer des nombres aléatoires de dix chiffres
16.15. Utiliser tail pour surveiller le journal des traces système
16.16. Afficher les lignes From des courriels stockés sous forme de fichiers
16.17. Émuler grep dans un script
16.18. Résolveur de mots croisés
16.19. Rechercher des définitions dans le dictionnaire Webster de 1913
16.20. Chercher les mots dans une liste pour tester leur validité
16.21. toupper : Transforme un fichier en majuscule.
16.22. lowercase : Change tous les noms de fichier du répertoire courant en minuscule.
16.23. du : Convertit les fichiers texte DOS vers UNIX.
16.24. rot13 : rot13, cryptage ultra-faible.
16.25. Générer des énigmes « Crypto-Citations »
16.26. Affichage d'un fichier formaté.
16.27. Utiliser column pour formater l'affichage des répertoires
16.28. nl : un script d'autonumérotation.
16.29. manview : Visualisation de pages man formatées
16.30. Utiliser cpio pour déplacer un répertoire complet
16.31. Déballer une archive rpm
16.32. Supprimer les commentaires des programmes C
16.33. Explorer /usr/X11R6/bin
16.34. Une commande strings « améliorée »
16.35. Utiliser cmp pour comparer deux fichiers à l'intérieur d'un script.
16.36. basename et dirname
16.37. Un script qui se copie lui-même en sections
16.38. Vérifier l'intégrité d'un fichier
16.39. Décoder des fichier codés avec uudecode
16.40. Trouver où dénoncer un spammeur
16.41. Analyser le domaine d'un courrier indésirable
16.42. Obtenir la cote d'une valeur de bourse
16.43. Mettre à jour FC4
16.44. Utilisation de ssh
16.45. Un script qui envoie son fichier source
16.46. Générer des nombres premiers
16.47. Paiement mensuel sur une hypothèque
16.48. Conversion de base
16.49. Appeler bc en utilisant un document en ligne
16.50. Calculer PI
16.51. Convertir une valeur décimale en hexadécimal
16.52. Factorisation
16.53. Calculer l'hypoténuse d'un triangle
16.54. Utiliser seq pour générer l'incrément d'une boucle
16.55. Compteur de lettres
16.56. Utiliser getopt pour analyser les paramètres de la ligne de commande
16.57. Un script qui se copie lui-même
16.58. S'exercer à dd
16.59. Capturer une saisie
16.60. Effacer les fichiers de façon sûre
16.61. Générateur de nom de fichier
16.62. Convertir des mètres en miles
16.63. Utiliser m4
17.1. Configurer un nouveau mot de passe
17.2. Configurer un caractère d'effacement
17.3. Mot de passe secret : Désactiver l'écho du terminal
17.4. Détection de l'appui sur une touche
17.5. Vérification d'identd sur un serveur distant
17.6. pidof aide à la suppression d'un processus
17.7. Vérifier une image
17.8. Création d'un système de fichiers dans un fichier
17.9. Ajoute un nouveau disque dur
17.10. Utiliser umask pour cacher un fichier en sortie
17.11. killall, à partir de /etc/rc.d/init.d
19.1. broadcast : envoie des messages à chaque personne connectée
19.2. fichierstupide : Crée un fichier stupide de deux lignes
19.3. Message multi-lignes en utilisant cat
19.4. Message multi-lignes, aves les tabulations supprimées
19.5. Document intégré avec paramètres substituables
19.6. Télécharger un ensemble de fichiers dans le répertoire de récupération Sunsite
19.7. Substitution de paramètres désactivée
19.8. Un script générant un autre script
19.9. Documents intégrés et fonctions
19.10. document intégré « anonyme »
19.11. Décommenter un bloc de code
19.12. Un script auto-documenté
19.13. Ajouter une ligne au début d'un fichier
19.14. Analyser une boîte mail
20.1. Rediriger stdin en utilisant exec
20.2. Rediriger stdout en utilisant exec
20.3. Rediriger à la fois stdin et stdout dans le même script avec exec
20.4. Éviter un sous-shell
20.5. Boucle while redirigée
20.6. Autre forme de boucle while redirigée
20.7. Boucle until redirigée
20.8. Boucle for redirigée
20.9. Rediriger la boucle for (à la fois stdin et stdout)
20.10. Rediriger un test if/then
20.11. Fichier de données nom.données pour les exemples ci-dessus
20.12. Enregistrer des événements
21.1. Étendue des variables dans un sous-shell
21.2. Lister les profils utilisateurs
21.3. Exécuter des processus en parallèle dans les sous-shells
22.1. Exécuter un script en mode restreint
23.1. Redirection de bloc de code dans une unique instance
23.2. Redirection de la sortie d'une substitution de processus vers une boucle.
24.1. Fonctions simples
24.2. Fonction prenant des paramètres
24.3. Fonctions et arguments en ligne de commande passés au script
24.4. Passer une référence indirecte à une fonction
24.5. Déréférencer un paramètre passé à une fonction
24.6. De nouveau, déréférencer un paramètre passé à une fonction
24.7. Maximum de deux nombres
24.8. Convertir des nombres en chiffres romains
24.9. Tester les valeurs de retour importantes dans une fonction
24.10. Comparer deux grands entiers
24.11. Vrai nom pour un utilisateur
24.12. Visibilité de la variable locale
24.13. Démonstration d'une fonction récursive simple
24.14. Autre démonstration simple
24.15. Récursion en utilisant une variable locale
24.16. La séquence de Fibonacci
24.17. Les tours d'Hanoi
25.1. Alias à l'intérieur d'un script
25.2. unalias : Configurer et supprimer un alias
26.1. Utiliser une liste ET pour tester des arguments de la ligne de commande
26.2. Un autre test des arguments de la ligne de commande en utilisant une liste and
26.3. Emploi de listes OU en combinaison avec une liste ET
27.1. Utilisation d'un tableau simple
27.2. Formatage d'un poème
27.3. Opérations de chaînes sur des tableaux
27.4. Charger le contenu d'un script dans un tableau
27.5. Quelques propriétés spéciales des tableaux
27.6. Des tableaux vides et des éléments vides
27.7. Initialiser des tableaux
27.8. Copier et concaténer des tableaux
27.9. Plus sur la concaténation de tableaux
27.10. Le tri bulle : Bubble Sort
27.11. Tableaux imbriqués et références indirectes
27.12. Le crible d'Ératosthène
27.13. Le crible d'Ératosthène, optimisé
27.14. Émuler une pile
27.15. Application complexe des tableaux Exploration d'une étrange série mathématique
27.16. Simuler un tableau à deux dimensions, puis son test
28.1. Références indirectes aux variables
28.2. Passer une référence indirecte à awk
29.1. Utiliser /dev/tcp pour corriger des problèmes
29.2. Jouer de la musique
29.3. Trouver le processus associé à un PID
29.4. État de la connexion
30.1. Affiche l'environnement serveur
30.2. Adresses IP
31.1. Cacher le cookie jar
31.2. Créer un fichier de swap en utilisant /dev/zero
31.3. Créer un disque ram
32.1. Un script bogué
32.2. Mot clé manquant
32.3. test24, un autre script bogué
32.4. Tester une condition avec un assert
32.5. Récupérer la sortie
32.6. Nettoyage après un Control-C
32.7. Implémentation simple d'une barre de progression
32.8. Suivre une variable
32.9. Lancer plusieurs processus (sur une machine SMP)
34.1. Les comparaisons d'entiers et de chaînes ne sont pas équivalentes
34.2. Problèmes des sous-shell
34.3. Envoyer la sortie de echo dans un tube pour un read
36.1. Script d'appel
36.2. Un script d'appel légèrement plus complexe
36.3. Un script d'appel générique qui écrit dans un fichier de traces
36.4. Un script d'appel autour d'un script awk
36.5. Un script d'appel autour d'un autre script awk
36.6. Perl inclus dans un script Bash
36.7. Combinaison de scripts Bash et Perl
36.8. Un script (inutile) qui s'appelle récursivement
36.9. Un script (utile) qui s'appelle récursivement
36.10. Un autre script (utile) qui s'appelle récursivement
36.11. Une base de données d'adresses « colorisée »
36.12. Dessiner une boîte
36.13. Afficher du texte colorisé
36.14. Un jeu de « courses de chevaux »
36.15. Barre de progression
36.16. Astuce de valeur de retour
36.17. Une astuce permettant de renvoyer plus d'une valeur de retour
36.18. Passer et renvoyer un tableau
36.19. Un peu de fun avec des anagrammes
36.20. Widgets appelés à partir d'un script shell
36.21. Suite de test
37.1. Expansion de chaîne de caractères
37.2. Références de variables indirectes - la nouvelle façon
37.3. Simple application de base de données, utilisant les références de variables indirectes
37.4. Utiliser des tableaux et autres astuces pour gérer quatre mains aléatoires dans un jeu de cartes
37.5. Petite base de données d'adresses
37.6. Base de données d'adresses un peu plus élaborée
37.7. Tests de caractères
37.8. Lecture de N caractères
37.9. Utilisation d'un here document pour assigner une valeur à une variable
37.10. Envoyer (par pipe) un flux d'entrée vers read
37.11. Indices de tableau négatifs
37.12. Paramètre négatif dans une extraction de chaîne
A.1. mailformat : Formater un courrier électronique
A.2. rn : Un utilitaire simple pour renommer des fichiers
A.3. blank-rename : Renommer les fichiers dont le nom contient des espaces
A.4. encryptedpw : Charger un fichier sur un site ftp, en utilisant un mot de passe crypté en local
A.5. copy-cd : Copier un CD de données
A.6. Séries de Collatz
A.7. days-between : Calculer le nombre de jours entre deux dates
A.8. makedict : Créer un dictionnaire
A.9. soundex : Conversion phonétique
A.10. Le Jeu de la Vie
A.11. Fichier de données pour le Jeu de la Vie
A.12. behead: Supprimer les en-têtes des courriers électroniques et des nouvelles
A.13. password: Générer des mots de passe aléatoires de 8 caractères
A.14. fifo: Faire des sauvegardes journalières, avec des tubes nommés
A.15. Générer des nombres premiers en utilisant l'opérateur modulo
A.16. tree: Afficher l'arborescence d'un répertoire
A.17. tree2 : un autre script d'arborescence de répertoires
A.18. string: Manipuler les chaînes de caractères comme en C
A.19. Informations sur les répertoires
A.20. Bibliothèque de fonctions de hachage
A.21. Coloriser du texte en utilisant les fonctions de hachage
A.22. Pour en savoir plus sur les fonctions de hachage
A.23. Monter des périphériques de stockage USB
A.24. Convertir en HTML
A.25. Préserver les weblogs
A.26. Protéger les chaînes littérales
A.27. Ne pas protéger les chaînes littérales
A.28. Identification d'un spammer
A.29. Chasse aux spammeurs
A.30. Rendre wget plus facile à utiliser
A.31. Un script de podcasting
A.32. Sauvegarde de nuit pour un disque firewire
A.33. Une commande cd étendue
A.34. Un script de configuration d'une carte son
A.35. Localise les paragraphes divisés dans un fichier texte
A.36. Tri d'insertion
A.37. Écart-type
A.38. Générateur de fichiers pad pour les auteurs de shareware
A.39. Éditeur de man page
A.40. Pétales autour d'une rose
A.41. Quacky : un jeu de mots de type Perquackey
A.42. Nim
A.43. Chronomètre en ligne de commande
A.44. Création de devoirs sur la programmation shell en général
A.45. Le Circuit du Chevalier
A.46. Carrés magiques
A.47. Taquin
A.48. Tours de Hanoi, version graphique
A.49. Tours de Hanoi, autre version graphique
A.50. Autre version du script getopt-simple.sh
A.51. La version de l'exemple UseGetOpt.sh utilisée dans l'appendice de complétion par Tab
A.52. Voir tour à tour tous les fonds colorés existants
A.53. Pratiquer le code Morse
A.54. Encoder/décoder le Base64
A.55. L'algorithme de chiffrement de Cronsfeld
A.56. Les bases revisitées
C.1. Compteur d'occurences des lettres
I.1. Completion script for UseGetOpt.sh
L.1. Exemple de fichier .bashrc
L.2. Fichier .bash_profile
M.1. VIEWDATA.BAT : Fichier Batch DOS
M.2. viewdata.sh : Conversion du script shell VIEWDATA.BAT
T.1. Un script qui génère une table ASCII