lorinc Posté(e) le 7 août 2005 Partager Posté(e) le 7 août 2005 10 EXERCICES DE BASH voilà, ce topic, n'est pas vraiment un tuto, pas vraiment du divers non plus. je vais vous présenter dans les quelques posts qui vont suivre 10 exercices de bash destinés à se familiariser avec la conception de script. le but étant de devenir, comme moi, un gros faineant qui aimme bien automatiser tout ce qu'il fait les connaissance requises sont nulles ou presque. il serait bon de savoir ce qu'est une variable, mais c'est à peu près tout. toutefois, je vous conseille les aide mémoires suivant : sur pci : http://www.pcinpact.com/forum/sujet_45608.htm ailleurs : http://www.tldp.org/LDP/Bash-Beginners-Guide/html/index.html http://www.linux.org/docs/ldp/howto/Bash-P...HOWTO.html#toc8 et un pdf proposé mar Mika : http://abs.traduc.org/abs-3.5-fr/abs-3.5.pdf sans oublier je ne saurais que trop vous conseiller un bouquin de C. Blaess qui s'appelle "Scripts sous Linux" aux éditions Eyrolles. Il est un peu cher (45€), mais très bien fait et très pratique. on trouvera d'ailleurs des memos du même auteur ici : http://www.blaess.fr/christophe/publications/memo/ la finalité de cette série est de faire un script qui fabrique une gallerie en html à partir d'un dossier contenant des images jpeg (wahouuu), qu'on va sobrement baptiser gallery je mets ce tuto dans la section unix, car je suis à peu près sûr qu'il sera vite oublié si je le mettais dans programmation. en effet, les seules personnes susceptibles d'être intéressées par des exercices de script shell sont chez les pingouins Ah oui, j'oubliais : Vous êtes bien sûr invités (et encourragés !) à aporter des corrections, des conseils, voir même d'autes exos. edit : ajout des indentations (foutu tabs qui ne passent pas... :8 ) ajout des conseils et corrections du 12/08 Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 1 : familiarisation faire un script en bash qui affiche "coucou" à l'écran ex : $sh ./exo1 coucou ( conseil : se servir de la commande echo) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 2 : familiarisation faire un script qui prend en argument deux nom de fichier, qui affiche "x sera copié dans y" (ou x est le nom du premier fichier et y le nom du second) et effectue la copie de x dans y (x et y étant variable, bien évidement) ex : $ls fichier1 $sh ./exo2 fichier1 fichier2 fichier1 sera copié dans fichier2 $ls fichier1 fichier2 ( conseil : la commande pour copier un fichier est cp) ( conseil : on accède aux variables passées en paramètre par $0, $1, $2... par exemple le script suivant : #!/bin/sh echo $0 echo $1 echo $2 ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo numero 3 : familiarisation faire un script qui prend en argument un nom de fichier, affiche "x sera sauvegardé en x_save", et effectue la copie de x dans un fichier nommé x suivi de _save ex : le contenu du répertoire : $ls fichier1 j'exécute mon script : $sh ./exo3 fichier1 fiochier1 sera sauvé en fichier1_save le contenu du répertoire bis : $ls fichier1 fichier1_save (tip : la concatenation de chaines est automatique avec bash ( ${1}_suffixe ) ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 4 : introduction à for construire un script qui prend en argument le nom d'un dosier (qu'on appelle $SOURCE_DIR). il créé un un dossier (qu'on appelle $DEST_DIR) qui se nomme $SOURCES_DIR concaténé à _save il copie l'intégralité du dossier $SOURCES_DIR dans $DEST_DIR, en ajoutant '_save' à la fin de chacun des fichiers ainsi copiés. le script doit annoncer chacune de ces actions par une phrase à l'écran (uniquement de l'affichage) exemple : le dossier 'photos' contient 'photo1.jpg' et 'photos2.jpg'. l'execution du script donne : $ sh ./exo4.sh photos création du repertoire photos_save copie de photos/photo1.jpg dans photos_save/photo1.jpg_save copie de photos/photo2.jpg dans photos_save/photo2.jpg_save $ et on doit trouver un dossier nomé 'photos_save' qui contient 'photo1.jpg_save' et 'photo2.jpg_save' (conseil : utiliser for et les "`" pour faire la boucle. par exemple: for i in `ls` do echo ${i} done se rappeller que la concaténation en bash est automatique. ex : VAR_A="bon" VAR_B="jour" VAR_C=${VAR_A}${VAR_B} echo ${VAR_C} Remarque : les {} dans l'appel d'une variable servent à enlever l'ambiguité. $VAR est identique à ${VAR}. par contre $VAR_1$VAR_2 est ambigüe ( si $VAR_2="toto", alors $VAR_1$VAR_2 est équivalent à $VAR_1toto ???) alors que ni ${VAR_1$VAR_2} ni ${VAR_1}${VAR_2} ne le sont... Remarque2 : les ` servent à exprimer le résultat d'un commande. par exemple pour mettre la liste des fichier contenus dans un repertoire dans une variable on peut faire VAR_1=`ls` autre ex : VAR_2=`echo coucou` VAR_3=`ps aux | grep root` Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 5 : pipes et constructions de fichier. le but de cet exercice est de faire un script qui va créé une page html contenant des liens vers les fichiers d'un répertoire donné. une page d'index en quelque sorte. cahier des charges : le script doit prendre en paramètre le nom du dossier à traiter. il doit créer dans ce dossier un fichier "index.html" ce fichier "index.html" doit avoir une syntaxe html valide. le corps de page doit en autre contenir des liens vers les fichiers contenus dans le repertoire à raison de de un lien par ligne. enfin, à la fin de son exécution, le script doit signaler qu'il a créé un fichier index.html dans le répertoire en question. ex : on dispose d'un répertoire photos contenant photo1.jpg et photo2.jpg dyn-ecim13:~/exo lorinc$ ls photos photo1.jpg photo2.jpg on appelle le script pour traiter ce répertoire: dyn-ecim13:~/exo lorinc$ sh ./exo5.sh photos photos/index.html écrit ! le repertoire photos contient maintenant un fichier "index.html" : dyn-ecim13:~/exo lorinc$ ls photos index.html photo1.jpg photo2.jpg et le contenu de ce fichier index.html est le suivant : dyn-ecim13:~/exo lorinc$ cat photos/index.html <HTML> <HEADER></HEADER> <BODY> <a href="photos/photo1.jpg">photo1.jpg</a><br /> <a href="photos/photo2.jpg">photo2.jpg</a><br /> </BODY> </HTML> dyn-ecim13:~/exo lorinc$ (cat sert à afficher le contenu d'un fichier texte à l'écran) conseils : utiliser la redirection de flux ">". par exemple : echo "coucou" > fichier_coucou fait en sorte que "coucou" ne soit pas écrit à l'écran mais plutôt dans le fichier "fichier_coucou" Attention : ">" écrase le fichier de destination s'il existe. si on veut écrire à la fin du fichier de destination, il faut utiliser ">>". ex : echo "coucou" > exempl echo "coucou numero 2" >> exempl cat exempl Remarque : on peut sauvegarder une liste d'éléments dans une variable pour s'en servir ultérieurement dans une boucle for. ça évite de mauvaises surprise quand la liste à été modifiée alors qu'on ne le souhaitait pas... ex : touch fic1 touch fic2 touch fic3 LISTE=`ls` touch fic4 touch fic5 for i in $LISTE do echo $i done dans ce cas, fic4 et fic5 n'apparraissent pas à l'écran. la liste du contenu du dossier à été sauvée dans $LISTE avant leur création Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 6 : convert, un outil Magick le but de cet exercice est de créer des miniatures de tout un tas d'image contenues dans un dossier. pour cela, le script récupère le nom du dossier à analiser, créé un repertoire "miniatures" dedans, et créé des miniature de 150px de large à partir de tous les *.jpg contenus dans le dossier. ces imagettes seront stockées dans "miniatures" et auront leur nom précédé de 'mini_" ex: $ls photos photo1.jpg photo2.jpg j'exécute mon script : $sh ./exo6 photos miniaturisation de photo1.jpg miniaturisation de photo2.jpg et, oh, surprise : $cd photos $ls miniatures photos photo1.jpg photo2.jpg $cd miniatures $ls mini_photo1.jpg mini_photo2.jpg (conseil : comme c'est marqué dans le titre, convert est mon ami. le man de convert étant assez peu loquace, chercher dans le man ImageMagick notement l'option scale, page et surtout geometry) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 7 : petit mélange Dans cet exo, on reprend un peu de tout ce qu'on a fait avant. le but est ici de créé un page html qui conteint un serie de liens pointant vers des images grand format sous forme d'imagettes de 150 px de large. comme dans l'exercice précédent, il faut créé le dossier "miniatures" contenant les modèles réduits, mais aussi la page index.html (qui doit être valide html) contenant les liens. ex: $ ls photos $cd photos $ls photo1.jpg photo2.jpg je lance mon scripte : sh ./exo7 photos miniaturisation de photo1.jpg ajout de photo1.jpg miniaturisation de photo2.jpg ajout de photo2.jpg index.html écrit et oh surprise : $cd photos $ls index.html linux_xxi.jpg miniatures TuXperience.jpg $ls miniatures mini_linux_xxi.jpg mini_TuXperience.jpg $cat index.html <HTML> <HEAD> <TITLE>index de images par lorinc</TITLE> </HEAD> <BODY> <a href="linux_xxi.jpg"><img src="miniatures/mini_linux_xxi.jpg" /></a><br /> <a href="TuXperience.jpg"><img src="miniatures/mini_TuXperience.jpg" /></a><br /> </BODY> </HTML> Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 8 : gallery version alpha on approche de la fin des exos, et donc il faut commencer à faire du vrai programme le but de cet exercice est de créer un version alpha de notre générateur de galerie. il doit prendre en argument un dossier, faire les vignettes (dans un dossier "miniatures"), faire la page index.html et la feuille de style defaut.css cet exo est là pour faire un apprentissage des fonctions en bash. les fonctions se déclare comme suit : function toto { echo "toto dit : $1" } essayez de faire un max de chose dans des petites fonctions. ex : $cd gallery $ ls cc_boot_con_auto.jpg cc_materiel_moniteur.jpg cc_montage_racine.jpg cc_reseaux_racine.jpg cc_secu_perm.jpg cc_boot_lilo_1.jpg cc_materiel_racine.jpg cc_montage_samba.jpg cc_reseaux_suppr.jpg cc_system_gestion_co.jpg cc_boot_lilo_2.jpg cc_materiel_resolution.jpg cc_racine.jpg cc_rpm_racine_maj1.jpg cc_system_heure.jpg cc_boot_racine.jpg cc_materiel_souris.jpg cc_reseaux_nouvelle_co.jpg cc_rpm_racine_maj2.jpg cc_system_log.jpg cc_boot_theme.jpg cc_montage_NFS.jpg cc_reseaux_partage.jpg cc_rpm_racine_media.jpg cc_system_police.jpg cc_materiel_imprimante.jpg cc_montage_partition.jpg cc_reseaux_proxy.jpg cc_secu_niveau.jpg cc_system_racine.jpg je lance mon superbe script : $sh ./exo7 gallery # header écrit # traitement de cc_boot_con_auto.jpg # traitée # ajout de cc_boot_con_auto.jpg # ajoutée # traitement de cc_boot_lilo_1.jpg # traitée # ajout de cc_boot_lilo_1.jpg # ajoutée [... je passe toutes les lignes ... ] # traitement de cc_system_police.jpg # traitée # ajout de cc_system_police.jpg # ajoutée # traitement de cc_system_racine.jpg # traitée # ajout de cc_system_racine.jpg # ajoutée # body écrit # footer écrit fin du script et on trouve : $cd gallery $ls cc_boot_con_auto.jpg cc_materiel_moniteur.jpg cc_montage_racine.jpg cc_reseaux_racine.jpg cc_secu_perm.jpg defaut.css cc_boot_lilo_1.jpg cc_materiel_racine.jpg cc_montage_samba.jpg cc_reseaux_suppr.jpg cc_system_gestion_co.jpg index.html cc_boot_lilo_2.jpg cc_materiel_resolution.jpg cc_racine.jpg cc_rpm_racine_maj1.jpg cc_system_heure.jpg miniatures cc_boot_racine.jpg cc_materiel_souris.jpg cc_reseaux_nouvelle_co.jpg cc_rpm_racine_maj2.jpg cc_system_log.jpg cc_boot_theme.jpg cc_montage_NFS.jpg cc_reseaux_partage.jpg cc_rpm_racine_media.jpg cc_system_police.jpg cc_materiel_imprimante.jpg cc_montage_partition.jpg cc_reseaux_proxy.jpg cc_secu_niveau.jpg cc_system_racine.jpg $cat index.html <HTML> <HEAD> <TITLE>index de gallery par lorinc</TITLE> <link rel="stylesheet" type="text/css" href="defaut.css"> </HEAD> <BODY> <ul> <li> <a href="cc_boot_con_auto.jpg" class="gal" > <span> <img src="cc_boot_con_auto.jpg" /><br /> </span> <img src="miniatures/mini_cc_boot_con_auto.jpg" /><br /> </a> </li> <li> <a href="cc_boot_lilo_1.jpg" class="gal" > <span> <img src="cc_boot_lilo_1.jpg" /><br /> </span> <img src="miniatures/mini_cc_boot_lilo_1.jpg" /><br /> </a> </li> [... je vous fais grace de toutes les entrées ...] <li> <a href="cc_system_racine.jpg" class="gal" > <span> <img src="cc_system_racine.jpg" /><br /> </span> <img src="miniatures/mini_cc_system_racine.jpg" /><br /> </a> </li> </BODY> </HTML> $cat defaut.css ul { padding:0; margin:0; list-style-type:none; } a.gal span { position:absolute; width:1px; height:1px; top:5px; left:5px; overflow:hidden; background:#fff; } a.gal:hover span { position:fixed; top:10px; left:175px; width:100%; height:100%; color:#000; background:#fff; } $ls miniatures mini_cc_boot_con_auto.jpg mini_cc_materiel_resolution.jpg mini_cc_reseaux_partage.jpg mini_cc_secu_perm.jpg mini_cc_boot_lilo_1.jpg mini_cc_materiel_souris.jpg mini_cc_reseaux_proxy.jpg mini_cc_system_gestion_co.jpg mini_cc_boot_lilo_2.jpg mini_cc_montage_NFS.jpg mini_cc_reseaux_racine.jpg mini_cc_system_heure.jpg mini_cc_boot_racine.jpg mini_cc_montage_partition.jpg mini_cc_reseaux_suppr.jpg mini_cc_system_log.jpg mini_cc_boot_theme.jpg mini_cc_montage_racine.jpg mini_cc_rpm_racine_maj1.jpg mini_cc_system_police.jpg mini_cc_materiel_imprimante.jpg mini_cc_montage_samba.jpg mini_cc_rpm_racine_maj2.jpg mini_cc_system_racine.jpg mini_cc_materiel_moniteur.jpg mini_cc_racine.jpg mini_cc_rpm_racine_media.jpg mini_cc_materiel_racine.jpg mini_cc_reseaux_nouvelle_co.jpg mini_cc_secu_niveau.jpg voilà. pour la feuille CSS, vous pouvez prendre celle là, ou bien être plus créatif :8 Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 9 : version beta de gallery la version beta doit permettre de gérer des erreurs et l'affichage d'une aide succinte. les fichier index.html et defaut.css étant les même, je ne remets pas les exemples. par contre, voici les tests à effectuer : -> le dossier en argument est-il valide (sinon eereur et exit) -> existe--t-il déjà un fichier index.html (si oui, erreur et exit) -> y-a-il des images à traiter (si non, erreur et exit) -> le dossier "miniatures" existe-t-il (si oui, warning et on continue) -> un fichier defaut.css existe déjà (si oui, warning et on continue) à vous d'en trouver d'autre ex : $sh ./exo9 gallery <WW> dossier de miniature déjà présent <EE> index.html existe ! <EE> fin du programme... usage exo9.sh <dossier> ou encore $sh ./exo9 gallepouet <EE> gallepouet n'est pas un repertoire valide! usage exo9.sh <dossier> (conseil : on peut tester la validité de fichier avec if ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 exo 10 : gallery version finale !!!! dans cette version, on ajout la gestion des options avec getopts, ainsi qu'un message d'aide un peu plus sympatoche ex : $./gallery -s truc <EE> truc n'est pas un repertoire valide! usage gallery [-FW] [-c <file.css>] [-s <dossier_source>] [-f <file.html>] [-m <dossier_miniatures>] OPTIONS : -W : force le programme à quitter en cas de warning -F : force le programme à continuer en cas d'erreur -c file.css : fournit la feuille de style CSS -s dossier_source : dossier des images de la gallerie -f file.html : fichier HTML dans lequel est sauvée la gallerie -m dossier_miniatures : dossier dans lequel seront crées les imagettes Distribué dans les termes de la licence GPL (http://www.gnu.org/licenses/gpl.html#TOC1) lorinc 2005 on peut trouver de l'aide sur getopts ici : http://www.die.net/doc/linux/abs-guide/int...l.html#GETOPTSX vous pouvez être fiers de vous (et de moi !!! ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 corrections : exo 1 : #!/bin/bash echo "coucou" exo 2 : #!/bin/bash echo "$1 sera copier dans $2" cp -- $1 $2 l'option -- permet de mettre fin à toutes les options. histoire de pourvoir quand même copier un fichier nommé -r, par exemple. exo 3 : #!/bin/bash DEST=${1}_save echo "$1 sera sauvegardé dans $DEST cp $1 $DEST Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 4 : #!/bin/sh #script faisant une copie de sauvegarde d'un repertoire passé en argument. #le script doit rajouter ".save." à la fin de chaque fichier copié #les répertoires SOUR_DIR=$1 DEST_DIR=${SOUR_DIR}.save #création du rep de destination mkdir $DEST_DIR #liste des fichiers à copier FILE_LIST=$(ls $SOUR_DIR) #corps de script for i in $FILE_LIST do cp ${SOUR_DIR}/$i ${DEST_DIR}/${i}.save echo "$i copié" done echo "" echo "fin de la copie" Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 5 : #!/bin/sh # script créant un index.html contenant des liens vers tous les fichiers # d'un repertoire passé en argument #repertoire SOUR_DIR=$1 # liste fichiers FILE_LIST=$(ls $SOUR_DIR) #fichier de sortie index.html OUT_FILE=${SOUR_DIR}/index.html #entete HTML echo "<HTML>" > $OUT_FILE echo "<HEAD>" >> $OUT_FILE echo "<TITLE>index de $SOUR_DIR par lorinc</TITLE>" >> $OUT_FILE echo "</HEAD>" >> $OUT_FILE echo "<BODY>" >> $OUT_FILE #corps du travail for i in $FILE_LIST do echo "ajout de $i" echo "<A href=\"$i\">$i</A><BR />" >> $OUT_FILE done #footer echo "</BODY>" >> $OUT_FILE echo "</HTML>" >> $OUT_FILE #fin echo "index.html fini" Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 6 : #!/bin/sh # cet exo créé un repertoire contenant des miniature des images jpeg # d'un rep passé en argument #les repertoires SOUR_DIR=$1 DEST_DIR="miniatures" cd $SOUR_DIR #creation du rep mkdir $DEST_DIR #liste des images FILE_LIST=$(ls *.jpg) cd .. echo "" #coprs du script for i in $FILE_LIST do echo "traitement de $i" convert ${SOUR_DIR}/$i -geometry 150 ${SOUR_DIR}/${DEST_DIR}/mini_$i echo "$i traitée" echo "" done #fin echo "traitement terminé" Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 7 : #!/bin/sh #script créant une page index.html # contenant les imagettes (avec les liens) de toutes les images # d'un dossier passé en argument #repertoire SOUR_DIR=$1 DEST_DIR="miniatures" # index.html OUT_FILE="index.html" cd $SOUR_DIR #creation du rep des imagettes mkdir $DEST_DIR #liste des images à traiter FILE_LIST=$(ls *.jpg) #debut echo "" #header echo "<HTML>" > $OUT_FILE echo "<HEAD>" >> $OUT_FILE echo "<TITLE>index de $SOUR_DIR par lorinc</TITLE>" >> $OUT_FILE echo "</HEAD>" >> $OUT_FILE echo "<BODY>" >> $OUT_FILE #corps for i in $FILE_LIST do MINI=mini_$i echo "# traitement de $i" convert $i -geometry 150 ${DEST_DIR}/$MINI echo "# traitée" echo "# ajout de $i" echo "<a href=\"$i\"><img src=\"${DEST_DIR}/$MINI\" /></a><br />" >> $OUT_FILE echo "# ajouté" echo "" done #footer echo "</BODY>" >> $OUT_FILE echo "</HTML>" >> $OUT_FILE #fin cd .. echo "index.html fini" Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 8 : #!/bin/sh # créé une page index.html contenant les imagettes/liens # des images du dossier passer en argument # applique un style CSS par défaut #fonction qui écrit le header function header { echo "<HTML>" > $1 echo "" >> $1 echo "<HEAD>" >> $1 echo " <TITLE>index de $SOUR_DIR par lorinc</TITLE>" >> $1 echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"defaut.css\">" >> $1 echo "</HEAD>" >> $1 echo "" >> $1 echo "<BODY>" >> $1 echo "# header écrit" } #fonction qui écrit le footer function footer { echo "</BODY>" >> $1 echo "" >> $1 echo "</HTML>" >> $1 echo "# footer écrit" } #fonction qui fabrique le corps de page # body(liste_images) function body { LIST_FILE=$* echo "<ul>" >> $OUT for i in $LIST_FILE do MINI=mini_$i echo "# traitement de $i" convert $i -geometry 150 ${DEST_DIR}/$MINI echo "# traitée" echo "# ajout de $i" echo "<li>" >> $OUT echo " <a href=\"$i\" class=\"gal\" >" >> $OUT echo " <span>" >> $OUT echo " <img src=\"$i\" /><br />" >> $OUT echo " </span>" >> $OUT echo " <img src=\"${DEST_DIR}/$MINI\" /><br />" >> $OUT echo " </a>" >> $OUT echo "</li>" >> $OUT echo "# ajoutée" echo "" done echo "# body écrit" } #fonction créant la feuille CSS defaut.css function css { echo "ul {" > defaut.css echo "padding:0; " >> defaut.css echo "margin:0; " >> defaut.css echo "list-style-type:none; " >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal span {" >> defaut.css echo "position:absolute; " >> defaut.css echo "width:1px; " >> defaut.css echo "height:1px; " >> defaut.css echo "top:5px; " >> defaut.css echo "left:5px; " >> defaut.css echo "overflow:hidden; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal:hover span {" >> defaut.css echo "position:fixed; " >> defaut.css echo "top:10px; " >> defaut.css echo "left:175px;" >> defaut.css echo "width:100%;" >> defaut.css echo "height:100%; " >> defaut.css echo "color:#000; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css } ######################### # # # DEBUT DU SCRIPT # # # ######################### #le rep source SOUR_DIR=$1 cd $SOUR_DIR #creation du rep de miniature mkdir miniatures DEST_DIR="miniatures" echo "" #liste des images à traiter LIST=$(ls *.jpg) #fichier de gallery FILE="index.html" OUT=$FILE header $FILE echo "" body $LIST echo "" footer $FILE echo "" #feuille css css #fin cd .. echo "fin du script" à partir d'un certain nombre de lignes à entrer dans un fichier, il peut être plus judicieux de le faire avec cat à la place de echo. ex : cat <<EOF > default.css ul { padding:0; margin:0; list-style-type:none; } a.gal span { position:absolute; width:1px; ... } EOF Je laisse quand même les echo pour le côté "en faire le plus possible avec le moins de commandes" de ces exos Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 9 : #!/bin/sh # créé une page index.html contenant les imagettes/liens # des images du dossier passer en argument # applique un style CSS par défaut # des tests sont effectués pour voir si le script ne dérange pas. ################################################# # # # creation de code html # # # ################################################# #fonction qui écrit le header function header { echo "<HTML>" > $1 echo "" >> $1 echo "<HEAD>" >> $1 echo " <TITLE>index de $SOUR_DIR par lorinc</TITLE>" >> $1 echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"defaut.css\">" >> $1 echo "</HEAD>" >> $1 echo "" >> $1 echo "<BODY>" >> $1 echo "# header écrit" } #fonction qui écrit le footer function footer { echo "</BODY>" >> $1 echo "" >> $1 echo "</HTML>" >> $1 echo "# footer écrit" } #fonction qui fabrique le corps de page # body(liste_images) function body { LIST_FILE=$* echo "<ul>" >> $OUT for i in $LIST_FILE do MINI=mini_$i echo "# traitement de $i" convert $i -geometry 150 ${DEST_DIR}/$MINI echo "# traitée" echo "# ajout de $i" echo "<li>" >> $OUT echo " <a href=\"$i\" class=\"gal\" >" >> $OUT echo " <span>" >> $OUT echo " <img src=\"$i\" /><br />" >> $OUT echo " </span>" >> $OUT echo " <img src=\"${DEST_DIR}/$MINI\" /><br />" >> $OUT echo " </a>" >> $OUT echo "</li>" >> $OUT echo "# ajoutée" echo "" done echo "# body écrit" } #fonction créant la feuille CSS defaut.css function css { if [ -e defaut.css ] then warn "defaut.css va être écrasé" fi echo "ul {" > defaut.css echo "padding:0; " >> defaut.css echo "margin:0; " >> defaut.css echo "list-style-type:none; " >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal span {" >> defaut.css echo "position:absolute; " >> defaut.css echo "width:1px; " >> defaut.css echo "height:1px; " >> defaut.css echo "top:5px; " >> defaut.css echo "left:5px; " >> defaut.css echo "overflow:hidden; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal:hover span {" >> defaut.css echo "position:fixed; " >> defaut.css echo "top:10px; " >> defaut.css echo "left:175px;" >> defaut.css echo "width:100%;" >> defaut.css echo "height:100%; " >> defaut.css echo "color:#000; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css } ################################################# # # # petits outils # # # ################################################# function warn { echo "<WW> $*" } function err { echo "<EE> $*" } function aide { echo echo "usage exo9.sh <dossier>" echo } function quit { exit $1 } ################################################# # # # DEBUT DU SCRIPT # # # ################################################# #test d'arguments if [ ! $# == 1 ] then aide quit 1 fi #le rep source SOUR_DIR=$1 if [ ! -d $SOUR_DIR ] then err "$SOUR_DIR n'est pas un repertoire valide!" aide quit 2 fi cd $SOUR_DIR #creation du rep de miniature if [ -e miniatures ] then warn "dossier de miniature déjà présent" else mkdir miniatures if [ ! -d miniatures ] then err "<EE> creation du repertoire de miniature impossible" aide quit 3 fi fi DEST_DIR="miniatures" echo "" #liste des images à traiter LIST=$(ls *.jpg) #fichier de gallery if [ -e index.html ] then err "index.html existe !" err "fin du programme..." aide quit 4 else FILE="index.html" OUT=$FILE fi header $FILE echo "" body $LIST echo "" footer $FILE echo "" #feuille css css #fin cd .. echo "fin du script" les test if peuvent être drastiquement concatenés. ex : if [ ! -d $DEST_DIR ] then err "<EE> creation du repertoire de miniature impossible" fi par [ -d $DEST_DIR ] || err "<EE> creation du repertoire de miniature impossible" Mais comme ces exercice s'adressent avant out à des personnes peut familières de Bash (voire de la programmation en générale) , je les laisserais sous leur forme complète par soucis de lisibilité. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 correction exo 10 : gallery #!/bin/sh #gallery v1.0 #released under GPL #author lorinc - 2005 # créé une page index.html contenant les imagettes/liens # des images # applique un style CSS par défaut # des tests sont effectués pour voir si le script ne dérange pas. # diverses options peuvent être passées ################################################# # # # init des flags # # # ################################################# SOUR_DIR="." DEST_DIR="miniatures" FILE="index.html" CSS_FILE="defaut.css" ################################################# # # # creation de code html # # # ################################################# #fonction qui écrit le header function header { echo "<HTML>" > $1 echo "" >> $1 echo "<HEAD>" >> $1 echo " <TITLE>index de $SOUR_DIR par lorinc</TITLE>" >> $1 echo " <link rel=\"stylesheet\" type=\"text/css\" href=\"$CSS_FILE\">" >> $1 echo "</HEAD>" >> $1 echo "" >> $1 echo "<BODY>" >> $1 echo "# header écrit" } #fonction qui écrit le footer function footer { echo "</BODY>" >> $1 echo "" >> $1 echo "</HTML>" >> $1 echo "# footer écrit" } #fonction qui fabrique le corps de page # et créé les imagettes # body(liste_images) function body { LIST_FILE=$* echo "<ul>" >> $FILE for i in $LIST_FILE do MINI=mini_$i echo "# traitement de $i" convert $i -geometry 150 ${DEST_DIR}/$MINI echo "# traitée" echo "# ajout de $i" echo "<li>" >> $FILE echo " <a href=\"$i\" class=\"gal\" >" >> $FILE echo " <span>" >> $FILE echo " <img src=\"$i\" /><br />" >> $FILE echo " </span>" >> $FILE echo " <img src=\"${DEST_DIR}/$MINI\" /><br />" >> $FILE echo " </a>" >> $FILE echo "</li>" >> $FILE echo "# ajoutée" echo "" done echo "</ul>" >> $FILE echo "# body écrit" } #fonction créant la feuille CSS defaut.css function css { if [ -e defaut.css ] then warn "defaut.css va être écrasé" fi echo "ul {" > defaut.css echo "padding:0; " >> defaut.css echo "margin:0; " >> defaut.css echo "list-style-type:none; " >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal span {" >> defaut.css echo "position:absolute; " >> defaut.css echo "width:1px; " >> defaut.css echo "height:1px; " >> defaut.css echo "top:5px; " >> defaut.css echo "left:5px; " >> defaut.css echo "overflow:hidden; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css echo "" >> defaut.css echo "a.gal:hover span {" >> defaut.css echo "position:fixed; " >> defaut.css echo "top:10px; " >> defaut.css echo "left:175px;" >> defaut.css echo "width:100%;" >> defaut.css echo "height:100%; " >> defaut.css echo "color:#000; " >> defaut.css echo "background:#fff;" >> defaut.css echo "}" >> defaut.css } ################################################# # # # petits outils # # # ################################################# function warn { echo "<WW> $*" if [ $WAR ] then err "fatal warning" fi echo } function err { echo "<EE> $*" if [ ! $FOR ] || [ $WAR ] then aide quit fi echo } function aide { echo echo "usage gallery [-FW] [-c <file.css>] [-s <dossier_source>] [-f <file.html>] [-m <dossier_miniatures>]" echo echo echo "OPTIONS :" echo echo "-W : force le programme à quitter en cas de warning" echo "-F : force le programme à continuer en cas d'erreur" echo "-c file.css : fournit la feuille de style CSS" echo "-s dossier_source : dossier des images de la gallerie (par défuat .)" echo "-f file.html : fichier HTML dans lequel est sauvée la gallerie (par défaut index.html)" echo "-m dossier_miniatures : dossier dans lequel seront crées les imagettes (par defaut miniatures)" echo echo echo "Distribué dans les termes de la licence GPL (http://www.gnu.org/licenses/gpl.html#TOC1)" echo "lorinc 2005" } function quit { exit $1 } ################################################# # # # DEBUT DU SCRIPT # # # ################################################# while getopts "WFc:s:f:m:" i do case $i in W ) echo "les warnings stopperont le programme comme les erreurs" echo WAR=1;; F ) echo "les erreurs ne stoppent plus le programme" echo FOR=1;; c ) CSS_FILE=$OPTARG;; s ) SOUR_DIR=$OPTARG;; f ) FILE=$OPTARG;; m ) DEST_DIR=$OPTARG;; * ) echo "option non valable" aide quit 0;; # DEFAULT esac done #le rep source if [ ! -d $SOUR_DIR ] then err "$SOUR_DIR n'est pas un repertoire valide!" fi echo "le repertoire à traiter est $SOUR_DIR" echo cd $SOUR_DIR #creation du rep de miniature echo "le repertoire dans lequel seront stockées les miniature est $DEST_DIR" if [ -d $DEST_DIR ] then warn "dossier de miniature déjà présent" else mkdir $DEST_DIR if [ ! -d $DEST_DIR ] then err "<EE> creation du repertoire de miniature impossible" fi fi echo "" #liste des images à traiter LIST=$(ls *.jpg ) if [ $? != 0 ] then err "pas d'image à traiter" fi #feuille css if [ $CSS_FILE = "defaut.css" ] then echo "la feuille CSS sera générée par le script (defaut.css)" css else echo "la feuille CSS est $CSS_FILE" fi echo #fichier de gallery echo "le fichier de gallery est $FILE" echo if [ -a $FILE ] then err "$FILE existe !" fi header $FILE echo "" body $LIST echo "" footer $FILE echo "" #fin cd .. echo "fin du script" Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 Remerciements : Klaus, tuXXX, ceric35 et lebarjoe pour m'avoir donné envie de faire ce sujet ma copine pour avoir testé les premiers exos what (qu'on voit plus souvent sur les news qu'ici d'ailleurs :8 ) et tuXXX pour leurs contributions et corrections . Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 reserved Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 7 août 2005 Auteur Partager Posté(e) le 7 août 2005 reserved Lien vers le commentaire Partager sur d’autres sites More sharing options...
astero-H Posté(e) le 7 août 2005 Partager Posté(e) le 7 août 2005 Remerciements : Klaus, tuXXX, ceric35 et lebarjoe pour m'avoir donné envie de faire ce sujet ma copine pour avoir testé les premiers exos Et merci a Lorinc de nous avoir pondu un topiK aussi INtéressant :8 C'est du tout bon, seul petit reproche : la partie css qui vient un peu embrouiller le truc... Sinon tout le reste est largement compréhensible. Lien vers le commentaire Partager sur d’autres sites More sharing options...
semionsi Posté(e) le 7 août 2005 Partager Posté(e) le 7 août 2005 ce topic c'est intéressant car le script bash est un language très simple qui permet de faire plein de chose :-) Lien vers le commentaire Partager sur d’autres sites More sharing options...
P-A Posté(e) le 7 août 2005 Partager Posté(e) le 7 août 2005 trés joli set d'exo bravo lorinc ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.