Outils d'utilisateurs

Outils du Site


lien:bash:perso:abs

retour

Guide avancé d'écriture des scripts Bash

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)

Objectifs du TP : extraire les scripts des pages html

Le guide avancée nous donne de très nombreux exemples : pour les utiliser nous avons besoin de les extraire

Télécharger les fichiers html

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/

Placez vous dans le répertoire 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.

Recherche des balises pour les scripts

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

Lire le fichier html2sh

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

Fichier sans script apo.html

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.

Extraire le script de aps.html dans tmp

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 ?

Extraire le script du fichier html aps.html

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.

2 scripts dans ch04.html

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

Nous allons étudier la fin du script html2sh avec ch04.html

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' 

Comparaison des résultats avec diff

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 

Proposez un nouveau script, qui extrait tous les scripts des pages html

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

Bonus

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 &gt; par > et &amp; 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

lien/bash/perso/abs.txt · Dernière modification: 2009/05/24 21:08 par per