Le but de cet exemple est de :
locate file![]()
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
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
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.
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.
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 :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 ».for dir in
rep1 rep2 rep3![]()
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 valeuret 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
».