Le script bash
Généralités
Le script V1langue.sh est écrit en langage bash sur un simple fichier texte que l'on édite sous Microsoft Windows avec notepad++ et sous MacOS avec XCode qui facilite la visualisation des lignes bien formées au moyen de codes de couleurs. Le bash est un langage de programmation exécutable par un interpréteur de commandes unix qui s'appelle le shell et qui se trouve sous Microsoft Windows dans le programme cygwin qui est téléchargeable gratuitement, ou qui vient avec MacOS sous la forme d'une console appelé le terminal, ou qui vient avec Linux également sous la forme d'un terminal. Le langage bash est lui-même une sorte de shell à défaut, puisque son vrai nom d'après la commande man bash est: Bash - GNU Bourne – Again SHell.
Le script V1langue.sh est exécuté lorsque l'on tape sur la fenêtre de commandes sh V1langue.sh < donnees-lang.txt, comme s'il s'agissait d'une seule commande. Le script V1langue.sh est une donnée en entrée pour le bash composée de:
- Une commande initiale qui indique le nom de l'interpréteur de commandes qui doit exécuter le script, ici il s'agit du bash, elle s'écrit #!/bin/bash sous Microsoft et #!/bin/sh sous MacOS.
- Des commandes directionnant les flux en entrée: read tablo, read fic1, read fic2, read fic3 et read fic4 permettent d'affecter à la variable tableau une donnée extérieure, en provenance de donnees-langue.txt, il s'agit de l'adresse ./TABLEAUX/bouchon-langue.html qui permet de créer une page html pour telle langue, de l'adresse ./URLS/conteneur-lang qui permet de créer le tableau 1 pour la même langue, de l'adresse ./URLS/liege-lang qui permet de créer le tableau 2 pour la même langue, de l'adresse ./URLS/embouteillage-lang qui permet de créer le tableau 3 pour la même langue, de l'adresse ./URLS/resto-lang qui permet de créer le tableau 4 pour la même langue, et ce à partir de la liste d'URLs vers lesquels ces fichiers pointent.
- Des commandes directionnant les flux en sortie: echo “Création page html pour la langue x” permet d'afficher à l'écran “Création page html pour la langue x” lorsque la commande est en train d'être exécutée, les différents tableaux mettent beaucoup de temps à être créés, ce pour quoi on a mis echo “Téléchargement tableau n...” quatre fois. Le métacaractère >> permet de rediriger la sortie vers un fichier sans écraser à chaque donnée entrant le contenu du fichier, c'est à dire en ajoutant les informations les unes après les autres, ici on redirige toutes les données dans la variable $tablo qui est actualisée en tant que page html.
- Une boucle for par tableau. Celle-ci reconnaît un par un les URLs contenus dans la liste d'URLs pour tel sens du mot bouchon et associe à la lecture des URLs un nombre au moyen d'un compteur. i=1 initialise la variable $i à 1 en dehors de la boucle, for nom in `cat $fic`, part du principe que le contenu du fichier en entrée sensdebouchon-lang est un mot, une unité en soi, puis décompose le contenu du fichier en une liste d'items commençant par un caractère alphanumérique, le h de http et finissant par le retour de chariot sous UNIX c'est à dire LF, actualise la variable $nom en fonction de chaque item de cette liste, assigne à la variable $nom à chaque fois un URL différent dans le fichier sensdebouchon-lang, exécute la boucle pour chaque item de la liste, exécute les commandes wget, lynx, egrep et echo invoquées dans la boucle {}, concatène grâce à la commande cat le résultat de tout ce qu'on fait avec chaque item présent sur une seule ligne, et le compteur let "i+=1" situé à l'intérieur de la boucle et après toutes les opérations rajoute 1 à $i à chaque fois qu'on exécute la boucle en entier pour un item, c'est à dire un URL. Dans la boucle for:
- fic
- désigne l'adresse du fichier ./URLS/sensdebouchon-lang qui désigne à son tour le contenu du fichier sensdebouchon-lang,
- $fic
- désigne individuellement et ligne par ligne chacun des items du fichier sensdebouchon-lang, c'est à dire chacune des URLs listées dans ce fichier,
- cat $fic1
- désigne à la fois la commande de concaténer le résultat de tout ce qu'on fait avec les URLs parce qu'il est dans in, et le fait que tous les URLs doivent être concaténés parce que cat est devant $fic,
- nom
- désigne d'après man bash un mot composé uniquement de caractères alphanumériques et de tirets du bas, et commençant par un caractère alphanumérique ou un tiret du bas, et donc l'item de fic qui est en train d'être lu, et donc l'URL de sensdebouchon-lang qui est en cours de lecture, et finalement
- $nom
- désigne l'item de fic pris dans une liste d'items comme une variable, l'une des URLs de sensdebouchon-lang comme un moment fugace de lecture qui sera enchaîné par une prochaîne lecture ou une sortie de la boucle.
- Des commentaires qui sont reconnus grâce au dièse # en début de ligne, qui fait en sorte que tout ce qui vient après et ce jusqu'au retour charriot sur UNIX LF soit ignoré.
Explication conceptuelle de notre script bash
Notre programme commence par la déclaration du shell qu'on utilise, le terminal dispose des shells ash, bash, tcsh et zsh, c'est pour cette raison qu'il faut dire quel est le shell sur lequel le programme doit tourner ? #!/bin/bash # Ensuite le bash exécute ligne par ligne les commandes. La première commande est read qui sert à lire une variable. read assigne à la variable tablo la valeur ./TABLEAUX/bouchon-langue.html qui est une adresse qui pointe vers le fichier bouchon-langue.html qui n'existe pas encore. Le fichier bouchon-langue.html ne sera crée que grâce à la commande echo "quelque chose" >> $tablo qui apparaît bien plus tard et qui contient le métacaractère >> qui redirige les flux en sortie et qui permet de créer des fichiers s'ils n'existent pas.
read tablo; En ce qui concerne la commande read, plus précisément, soit le programme programme.sh et le fichier en entrée fichier1.txt contenant les lignes suivantes: programme.sh #!/bin/bash
read x;LF
echo $x;LF
read y;LF
echo $y;LF
read z;LF
echo $z;LFfichier1.txt a b cLF
d e fLF
Lorsqu'on exécute programme.sh on obtient sur le terminal:
Terminal User-name@nom-ordinateur ~
$ sh programme.sh < fichier1.txt
a b c
d e f
_User-name@nom-ordinateur ~
$Ce qui signifie que read x lit l'intégralité de la première ligne jusqu'au retour chariot sur UNIX symbolisé par LF. Et read y lit l'intégralité de la deuxième ligne. Et read z ne lit rien mais affiche l'absence de ligne supplémentaire comme quelque chose. En ce qui concerne le fonctionnement de notre programme sh V1langue.sh < donnees-lang.txt permet grâce à l'opérateur de redirection des flux en entrée d'utiliser le fichier donnees-lang.txt au lieu de taper manuellement l'adresse des fichiers qu'on va associer aux variables. Donc le fichier donnees-lang.txt est ouvert par l'environnement bash et suivant l'ordre d'apparition des commandes read, chaque variable postposée est associée à l'une des lignes du fichier donnes-lang.txt. Ces lignes contiennent des valeurs dont l'existence peut être virtuelle ou effective. Et la première des valeurs de read, ./TABLEAUX/bouchon-langue.html, est virtuelle car read ne crée pas les fichiers mais l'opérateur de redirection des flux en sortie >> crée ce fichier car il n'existe pas encore puis l'ouvre pour écrire "quelque chose" grâce à la commande echo dedans.
Terminal User-name@nom-ordinateur ~
$ echo "quelque chose" >> bouchon-langue.html
_User-name@nom-ordinateur ~
$read fic1; Lit le fichier ./URLS/conteneur-lang qui contient la liste des URLs pour bouchon dans le sens de conteneur dans la langue x. echo "Téléchargement tableau 1..."; Annonce à l'utilisateur que Bash est en train de lire la liste des URLs pour le premier tableau, c'est à dire le tableau bouchon dans le sens de conteneur. echo "<html><head><title>Bouchon dans la langue x</title></head><body bgcolor=\"lightblue\"><h2><font color=\"red\">Bouchon dans la langue x</font></h2>" >> $tablo; Ouvre l'html grâce à la balise html <html>?<à la balise/html>
Sépare l'en-tête du document de son corps grâce <head>?</head> et à la balise <body>?</body>
Met un titre dans la barre de titre grâce à la balise <title>?</title>
Crée un titre de taille assez grande grâce à la balise<h2>?</h2>
Rajoute le tout sans écraser ce qu'il y avait avant (on aurait pu mettre > car il n'y avait rien avant mais j'ai mis >>) grâce au métacaractère Bash >> dans la variable $tablo associée à ./TABLEAUX/bouchon-langue.htmlL'ensemble des commandes echo dans le programme avec des balises html ont été pensées afin de réaliser un tableau de ce type:
CONTENEUR: traduction URL 43 PAGE ASPIREE PAGE DUMP PAGE CONTEXTE URL 44 PAGE ASPIREE PAGE DUMP PAGE CONTEXTE URL 45 PAGE ASPIREE PAGE DUMP PAGE CONTEXTE
i=1 Le compteur a été initialisé à 1 avant d'appliquer les traitements automatiques et une seule fois pour tout le programme afin que les tableaux ne recommencent pas tout de zéro à chaque fois. for nom1 in `cat $fic1` La boucle for permet d'appliquer le même traitement pour toutes les lignes du tableau. wget -O ./PAGES-ASPIREES/Portugais/$i.html $nom1 wget est un logiciel qui permet de télécharger les pages html du fichier ./URLS/conteneur-lang et l'option -O permet de renommer le fichier avec le numéro que le compteur a choisit là où on a choisit de le mettre. Par exemple si on a un dossier TEST et que l'on souhaite mettre l'URL http://www.apple.fr dedans, on fait: $ wget -O ./TEST/nom-choisit.html http://www.apple.fr lynx -dump -nolist $nom1 > ./DUMP-TEXT/Langue/$i.txt Lynx est un navigateur tout comme Internet Explorer, Mozilla Firefox ou Safari qui affiche du texte sans les images. L'option -dump permet de récupérer le texte à l'écran au lieu de l'ouvrir dans le navigateur lynx. L'option -nolist permet de retirer les liens de la page web affichés à la façon de lynx, c'est-à-dire avec des numéros entre crochets [1] [2] et des notes en bas de page 1.http:// 2.http:// lynx -dump http://www.geocities.com/laviedesbouchonssurleweb/index.html > pageavecliens.txt
lynx -dump -nolist http://www.geocities.com/laviedesbouchonssurleweb/index.html > pagesansliens.txtegrep -i "\bmotif\b" ./DUMP-TEXT/Langue/$i.txt > ./CONTEXTES/Langue/$i.txt Egrep recherche le motif correspondant à l'expression régulière donné dans les lignes du fichier en entrée et imprime les lignes trouvées dans le fichier en sortie. \b est une frontière de début ou fin de mot, voici quelques uns des éléments permettant d'écrire une expression régulière:
\w = caractère alphanumérique
\b = début de mot ou fin de mot
+ = au moins une occurrence du caractère d'avant
. = n'importe quel caractère sauf le retour à la ligne
? = caractère d'avant est présent soit 0 fois soit 1 fois
* = le caractère d'avant peut être présent de 0 à un nombre quelconque de fois
| = ou inclusif
( ) = toute la chaîne ex: (a|A)(lphabet)(s|$)
[ ] = tous les caractères ex: [a-z A-Z 0-3]
(^ )= en début de ligne ex: (^Il)
$ = fin de ligne ex: et$
[^ ]= qui n'appartiennent pas à telle classe de caractères ex: [^ aeiou]cat ./CONTEXTES/Langue/$i.txt >> ./CONTEXTES/Langue/contexte-conteneur-lang.txt cat concatène toutes les lignes de chaque fichier ./CONTEXTES/Langue/$i.txt et les imprime à la queue leu leu dans ./CONTEXTES/Langue/contexte-conteneur-lang.txt qui nous servira comme support pour l'édition des nuages de mots. Finalement let "i+=1" ; permet d'attribuer un nombre différent à chaque fichier lu. Légende des couleurs pour le texte simple:
Couleur du texte
Couleur des liens
Couleur des liens lors du clic
Couleur des liens après le clic - liens déjà vus
Couleur des commandes sur le terminal
Couleur du texte affiché par les fichiers du terminal
Couleur des fichiers en soi-même
Couleur des commentaires et de la commande initiale
Couleur des commandes et des métacaractères
Couleur des variables crées
Couleur des variables rappelées