Une exploration en profondeur de l'art de la programmation shell
Téléchargement de ABS en français Le Guide en ligne en français Le Guide en ligne en anglais
Le TP se fait en console en mode texte, sans interface graphique
(on peut le faire avec une interface graphique, mais il faudra l'adapter)
Le guide avancée nous donne de très nombreux exemples : pour les utiliser nous avons besoin de les extraire
wget -r http://abs.traduc.org/abs-5.3-fr/ Proposez un autre wget pour n'obtenir que les fichiers de abs-5.3-fr/
Lire le fichier aps.html
Lire le fichier html avec ……..
pour quitter taper q puis répondez à la question .
Comme vous pouvez le voir vous avez un script dans le fichier html.
Nous allons voir le source du fichier html avec
less aps.html
Repérer la ligne #!/bin/bash
Pour rechercher dans un fichier avec less, on peut faire comme dans un man
/#!/bin/bash
Indiquer la ligne précédent cette ligne
<pre …………………………
rechercher ensuite la fin de cette section avec
</pre>
Comme vous pouvez le voir tout le script, se trouve entre ces 2 balises
Nous allons nous en servir pour extraire les scripts des fichiers html
html2sh Ce fichier va nous permettre d'extraire les scripts des fichiers html
Au départ, on a une fonction pour mettre un arrêt dans le script
Cette fonction affiche ………….
Puis quitte le script proprement avec exit 0
Pour s'en servir, il suffit de placer
arret # sur une ligne pour arrêter le script
Début du script, on va avoir un test pour voir si il y a un argument
Sans argument le script s'arrête
Précisez la ligne ………………………
On a ensuite un test pour savoir si il y a un script dans le fichier
Regardez le fichier apo.html avec w3m, vérifier visuellement que ce fichier n'a pas de script.
Quitter avec q puis y.
Nous allons le vérifier avec ./html2sh apo.html
Préciser le résultat de cette commande …………….
Rechercher à la fin du script html2sh, les lignes qui ont permis l'affichage du résultat précédent.
Regarder le script aps.html avec w3m puis less
On va extraire les lignes comprises entre <pre … et </pre>
lancez ./html2sh aps.html
remarquez comme il se termine
Visualisez alors le fichier tmp avec less tmp
Que contient ce fichier si on enlève la première et la dernière ligne ?
Commentez l'arrêt dans html2sh
Relancez alors ./html2sh aps.html
Indiquez la réponse du script ……………………..
Donnez le résultat de la commande ls *.sh
Visualisez ce fichier.
Visualisez ch04.html avec less
lancez ./html2sh ch04.html
Indiquez la réponse du script ………………….
visualisez le fichier tmp
Donnez le résultat de la commande ls ch04*.sh
Visualisez ces fichiers
fin_script=$(sed -n ”/pre>/=” tmp)
echo “fin_script : $fin_script” #on l'affiche
Cette partie est affichée lorsque l'on lance le script ./html2sh ch04.html
fichier=${1%.*} #on enlève l'extension .html du fichier
Donner dans notre cas la valeur de fichier
i=1 #on initialise à 1, le numéro du script
deb=1 #le début commence à 1
for fin in $fin_script #on sépare les différents scripts
Précisez les valeurs que prendra fin ……………
do sed -n "$deb,${fin}p" tmp |sed -e "s/<\/pre>//;s/<pre class=\"programlisting\">//" -e 's/^ *$//;/./,$!d' >${fichier}_${i}.sh deb=$fin #pour le script suivant let i=i+1 #on incrémente le numéro de script done
On va faire les boucle manuellement :
Avec la première valeur de fin, lancez sed -n “1, …p” tmp |less
deb prend alors la valeur de fin soit ….
i s'incrémente
On recommence la boucle for avec fin qui prend la deuxième valeur
lancez sed -n ” …,…p” tmp
Pour ce deuxième cas, lancez
sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/<pre class=\"programlisting\">//"
Notez les différences.
Enfin, lancez sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/<pre class=\"programlisting\">//" -e 's/^ *$//' -e '/./,$!d'
sed -n " ...,...p" tmp >tmp1 sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/<pre class=\"programlisting\">//" >tmp2 sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/<pre class=\"programlisting\">//" -e 's/^ *$//' -e '/./,$!d' >tmp3 puis diff tmp1 tmp2 enfin diff tmp2 tmp3
On pourra par exemple lancer le script html2sh pour tous les fichiers html du répertoire, avec une boucle for.
Comment lister tous les fichiers html : …………..
Pour chaque fichier html de la liste
faire
./html2sh ……..
fin de la boucle for
Le premier fichier aps_1.sh ne peut être exécuté du fait de caractères
spéciaux 'html'
Vérifier avec grep \& aps_1.sh
On va donc remplacer > par > et & par &
Compléter la ligne sed 's/…/>/;s/…../\&/g' aps_1.sh >aps_01.sh
Vérifier que aps_01.sh s'exécute sans erreur