next up previous contents index
suivant: Exemple 2 monter: Exemples avancés précédent: Exemples avancés   Table des matières   Index


Exemple 1

Le but de cet exemple est de :

But :

L'utilisateur désire connaître la localisation dans l'arborescence du système de diverses commandes.


Réalisation :

On se propose, alors, de développer un script en Bourne Shell, dont le nom est « locate », acceptant un nombre quelconque d'arguments représentant les commandes à localiser et d'afficher le chemin absolu de chaque exécutable correspondant. Si, par hasard, aucun fichier n'a pu être trouvé, on affichera un message d'erreur.


Syntaxe :

La syntaxe proposée, pour appeler ce script est :
locate file$\cdots$

Le script obtenu est alors :

#!/bin/sh
if [ $# -eq 0 ]; then
    echo "`basename $0`: missing arguments." >&2
    echo "usage: `basename $0` file ..." >&2
    exit -1
fi
while
    [ $# -ne 0 ]
do
    find_it=0
    for dir in `echo $PATH | sed -e 's/:/ /g'`
    do
        if [ -f $dir/$1 ]; then
            echo $dir/$1
            find_it=1
            break
        fi
    done
    [ $find_it -eq 0 ] && echo "$1 not found in \"PATH\" variable." >&2
    shift
done

Nous allons maintenant détailler le fonctionnement.

#!/bin/sh
if [ $# -eq 0 ]; then
    echo "`basename $0`: missing arguments." >&2
    echo "usage: `basename $0` file ..." >&2
    exit -1
fi

Tout d'abord, le script vérifie que le nombre d'arguments est bien non nul grâce à la variable « $# ». Si ce n'est pas le cas, on extrait le nom du script, contenu dans la variable « $0 » pour afficher le message d'erreur correspondant, ainsi que la façon de l'utiliser.

while
    [ $# -ne 0 ]
do



$\cdots$


    shift
done
Afin de pouvoir analyser tous les arguments, le programme va effectuer une boucle tant que le nombre d'arguments est non nul. L'utilisation de la commande « shift » permettra de mettre à jour la valeur qui y est contenue et l'argument qui sera traité sera toujours contenu dans la variable positionnelle « 1 » (son contenu sera appelé grâce à « $1 »).

find_it=0
for dir in `echo $PATH | sed -e 's/:/ /g'`
do



$\cdots$


done
La variable « PATH » contient la liste des répertoires à examiner, sachant que chaque nom est séparé par le caractère « : ». La boucle « for » admet une liste de valeurs séparées par des espaces. Par conséquent, il faut fournir à « for », cette liste à partir du contenu de « PATH » dont il faudra remplacer « : » par \fbox{\textsc{space}} .

Pour cela, la commande « echo $PATH » renvoie sur l'entrée standard de la commande « sed ». La requête « s/:/ /g » substitue chaque occurence (grâce à l'option « g ») du caractère « : » par \fbox{\textsc{space}} .

Le résultat de « `echo $PATH | sed -e 's/:/ /g'` » est évalué par le shell lors de l'étape des « substitutions de commandes ». Le résultat obtenu est donc :
for dir in rep1 rep2 rep3 $\cdots$
Par conséquent, la variable « dir » va contenir, à chaque itération, l'un des répertoires contenus dans la variable « PATH ». Il ne restera plus qu'à vérifier l'existance du fichier concerné, dont le nom, lui, est contenu dans la variable « 1 ». Cette variable prendra, à tour de rôle, la valeur des différents arguments passé au script, gestion assuré par la boucle « while » associé à la commande « shift ».

La variable « find_it » est un flag indiquant si le fichier a été trouvé lors de l'exécution de la boucle « for ».

if [ -f $dir/$1 ]; then
    echo $dir/$1
    find_it=1
    break
fi
Cette opération est simple. Un test vérifie l'existance du fichier. S'il existe, le nom complet est affiché sur la sortie standard et le flag « find_it » est positionné à la valeur $1$ et on force la sortie de la boucle « for ». Dans le cas contraire, l'exécution de la boucle se poursuit.

[ $find_it -eq 0 ] && echo "$1 not found in \"PATH\" variable." >&2
shift
À ce stade de l'exécution, chaque répertoire contenu dans la variable « PATH » a été examiné, à moins qu'une sortie n'aie été provoqué lorsque le fichier a été trouvé. Dans ce cas, le script affichera le message d'information sur la sortie d'erreur standard (redirection grâce à « >&2 ») à condition que la variable « find_it » soit non nulle.

Il ne restera plus qu'à passer à l'argument suivant grâce à la commande « shift ».


next up previous contents index
suivant: Exemple 2 monter: Exemples avancés précédent: Exemples avancés   Table des matières   Index
baudry@esme.fr