[[.:utilitaires|retour]] ==== Guide avancé d'écriture des scripts Bash ==== **Une exploration en profondeur de l'art de la programmation shell** [[http://abs.traduc.org/downloadmanuel.html |Téléchargement de ABS en français]] [[http://abs.traduc.org/abs-5.3-fr/ |Le Guide en ligne en français]] [[http://tldp.org/LDP/abs/html/ |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

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 ====
[[.:abs: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 
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/
//" -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/
//"

Notez les différences.

Enfin, lancez  sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/
//" -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/
//" >tmp2
sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/
//" -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 > 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