Vous êtes sur la page 1sur 3

Unix : Exercices sur les scripts

Scripts 1. Ecrire un script nomm bavard qui affiche 'j'ai reu n paramtres' et les affiche sur la mme ligne l'cran. par exemple si on tape ./bavard toto titi tata il affichera: j'ai recu 3 paramtres toto titi tata #!/bin/sh echo "je suis $0 et" echo "j'ai recu $# paramtres" echo "le 1er est $1" for p in "$@" do echo $p done

$0 renvoie le nom du script $# renvoie le nombre de paramtres $@ renvoie tous les paramtres comme une liste une autre solution est d'utiliser l'oprateur shift qui dcale les paramtres vers la gauche ($1 est perdu, $2 devient $1 ...). #!/bin/sh echo "je suis $0 et" echo "j'ai recu $# paramtres" while [ ! -z $1 ] do echo $1 shift done

2. Ecrire un script nomm lsd (Lists Seulement Directory) qui affiche la liste des rpertoires du rpertoire (et pas les fichiers) qu'il reoit en paramtres. S'il n'a pas de paramtres alors il utilise le rpertoire courant. La commande d'affichage des repertoires seuls a t vue dans les exercices sur les filtres; il suffit donc de l'inclure dans un script avec une vrification du nombre d'arguments (0 ou 1).

#!/bin/sh if [ $# -gt 1 ] then echo "usage $0 [repertoire]" else ls -l $1 |egrep ^d |tr -s ' ' ' ' |cut -f 9 -d ' ' | tr '\012' ' ' echo fi
3. Modifier lsd pour qu'il accepte l'option -l et affiche ainsi la liste longue (comme l'option -l de ls) des rpertoires du rpertoire qu'il reoit en paramtres. S'il n'a pas de paramtres alors il utilise le rpertoire courant.

En affichage long il suffit d'un ls -l |egrep ^d ...

#!/bin/sh set -x if [ $# -gt 2 ] then echo "usage $0 [-l] [repertoire]" else long=0 if [ $# -gt 0 -a $1 = '-l' ] ; then long=1 # dcalage des paramtres le rpertoire passe en $1 shift fi if [ $long -gt 0 ] ; then ls -l $1 |egrep ^d else ls -l $1 |egrep ^d |tr -s ' ' ' ' |cut -f 9 -d ' ' | tr '\012' ' ' echo fi fi

4. crire un script nomm check qui affiche OK si un mot qu'il reoit en paramtre est dans le dictionnaire lesmots.txt et KO sinon.

#!/bin/sh set -x FIC='lesmots.txt' if [ $# -ne 1 ] then echo "usage $0 mot_a_verifier" else echo "vrification de $1" motif="\<$1\>" if [ `egrep $motif $FIC | wc -l` -ne 0 ] then echo "OK" else echo "KO" fi fi
Il faut comparer le rsultat de la commande egrep | wc 0, d'ou les apostrophes inverses.

Uneautre solution utilise l'oprateur $? qui renvoie le code de sortie de la commande prcdente; par convention ce code est 0 s'il n'y a pas eu d'erreur et diffrent de zro sinon. Comme indiqu dans le man, egrep renvoie 0 si des correspondances ont t trouves:

#!/bin/sh set -x FIC='lesmots.txt' if [ $# -ne 1 ] then echo "usage $0 mot_a_verifier" else echo "vrification de $1" motif="\<$1\>" egrep $motif $FIC if [ $? -ne 0 ]

then echo "KO" else echo "OK" fi fi

5. crire un script shell qui "dcoupe" le fichier lesmots.txt en fabriquant 26 fichiers nomms a.txt, b.txt,.... z.txt et contenant les mots commenant par les lettres a,b ... z et affichant: fichier a.txt cr avec 7219 mots fichier b.txt cr avec 4068 mots ... fichier z.txt cr avec 267 mots somme des mots de chaque fichier: 90494 nombre de mots au dpart: 90494 chouette j'ai rien perdu ! ( si les deux rsutats ci-dessus sont les mmes, sinon un message d'erreur !) Il faut filtrer les lignes commenant par chaque lettre et rediriger vers un fichier different :

#!/bin/sh FIC='lesmots.txt' total=0 for i in a b c d e f g h i j k l m n o p q r s t u v w x y z do #echo $i cat $FIC | egrep "^$i" >$i.txt nb=`cat $i.txt | wc -l` echo " fichier $i.txt cr avec $nb mots" total=`expr $total + $nb` done total2=`cat $FIC | wc -l` echo somme de chaque= $total nombre de mots :$total2 if [ $total -eq $total2 ] ; then echo "chouette j'ai rien perdu" else echo "aieeeeeee" fi

BIM Linux (c) P.Pollet Oct. 2002