Jump to content

Archived

This topic is now archived and is closed to further replies.

lorinc

[Tuto][débutant] 10 exercices de bash

Recommended Posts

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 :roll:

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 :fou: :

http://abs.traduc.org/abs-3.5-fr/abs-3.5.pdf

sans oublier :oops:

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

:-D

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

Share this post


Link to post
Share on other sites

exo 1 : familiarisation

faire un script en bash qui affiche "coucou" à l'écran

ex :

$sh ./exo1
coucou

( conseil : se servir de la commande echo)

Share this post


Link to post
Share on other sites

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

)

Share this post


Link to post
Share on other sites

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 ) )

Share this post


Link to post
Share on other sites

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`

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

exo 6 : convert, un outil Magick :oops:

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)

Share this post


Link to post
Share on other sites

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>

Share this post


Link to post
Share on other sites

exo 8 : gallery version alpha

on approche de la fin des exos, et donc il faut commencer à faire du vrai programme :oops:

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

Share this post


Link to post
Share on other sites

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 )

Share this post


Link to post
Share on other sites

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 !!! )

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

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é"

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

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 :oops:

Share this post


Link to post
Share on other sites

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é.

Share this post


Link to post
Share on other sites

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"

Share this post


Link to post
Share on other sites

Remerciements :

Klaus, tuXXX, ceric35 et lebarjoe pour m'avoir donné envie de faire ce sujet

ma copine pour avoir testé les premiers exos :oops:

what (qu'on voit plus souvent sur les news qu'ici d'ailleurs :8 ) et tuXXX pour leurs contributions et corrections :roll: .

Share this post


Link to post
Share on other sites
Remerciements :

Klaus, tuXXX, ceric35 et lebarjoe pour m'avoir donné envie de faire ce sujet

ma copine pour avoir testé les premiers exos :-D

Et merci a Lorinc de nous avoir pondu un topiK aussi INtéressant :fou:

:oops: :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.

:roll:

Share this post


Link to post
Share on other sites
:oops: ce topic c'est intéressant car le script bash est un language très simple qui permet de faire plein de chose :-)

Share this post


Link to post
Share on other sites

×
×
  • Create New...