[[.: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 entrelancez ./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/
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//" -e 's/^ *$//;/./,$!d' >${fichier}_${i}.sh deb=$fin #pour le script suivant let i=i+1 #on incrémente le numéro de script donesed -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/
=== Comparaison des résultats avec diff ===//" -e 's/^ *$//' -e '/./,$!d'sed -n " ...,...p" tmp >tmp1 sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s/
==== 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//" >tmp2 sed -n "...,...p" tmp |sed -e "s/<\/pre>//" -e "s///" -e 's/^ *$//' -e '/./,$!d' >tmp3 puis diff tmp1 tmp2 enfin diff tmp2 tmp3