Arguments d'appel du script
Les differents arguments de l'appel du script sont disponibles dans les
pseudo-variables $1, $2, $3, etc. Cela permet d'ecrire des scripts
qui travaillent, par exemple, sur des fichiers dont les noms sont passes
en arguments, et pas toujours sur le meme fichier.
En fait, $0 contient le nom sous lequel a ete invoque le script,
$# le nombre d'arguments (ie le nombre de mots sur la ligne de commande,
moins un pour la commande elle-meme), et $* contient la liste des
arguments complete.
"Exercice":
Ecrire un mini-script pour verifier ces affirmations.
Exercice:
Ecrire un script qui prend deux arguments; le premier est cense
etre un nom de fichier, et le second une "extension" (sans point). L'effet
du script est de renommer le fichier en lui ajoutant l'extension proposee.
Branchements dans un script: if et test
On peut n'executer une partie d'un script que si une "condition" est remplie.
Syntaxe:
if test <condition>
then
<partie conditionnelle du script>
fi
Plusieurs remarques importantes sur la syntaxe:
- pour eviter de mauvaises surprises, respecter les retours a la ligne
- "test" est ici un programme qui travaille en collaboration
avec bash; comme les arguments sont d'abord lus par bash, la syntaxe est
forcement assez contraignante: tous les mots doivent imperativement etre
bien separes
- syntaxe alternative, mais c'est la meme chose: if [ <condition>
]
Les conditions que reconnait test sont orientees vers les fichiers:
- -e <nom> : existence d'un fichier
- -f <nom> : existence d'un fichier "normal"
- -d <nom> : existence, repertoire
- -x, -r, -w <nom> : verification des droits
Il existe aussi des operateurs pour comparer des "chaines" (toutes les variables
sont evaluees non comme des nombres, mais comme des chaines de caracteres):
- <ch1> = <ch2> : egalite
- <ch1> != <ch2> : non-egalite (aussi: ! <condition>)
Lorsque des chaines peuvent etre evaluees comme entiers:
- <entier1> -eq <entier2> : egalite
- <entier2> -ge <entier2> : >=
Lire la page de manuel de test pour plus de details, et pour voir comment
combiner (et, ou) les conditions. Attention: pour grouper des arguments sous
forme de sous-expressions, il faut utiliser les parentheses ( ) ; comme ce
sont des caracteres speciaux pour bash, il faut les "proteger" de bash au
moyen de \:
if [ \( -f $1 \) -a \( ! -e $1.$2 \) ]
Exercice:
Reprendre le script precedent, et lui faire tester les conditions
d'erreur raisonnable (existence du fichier a renommer, non-existence du fichier
a creer).
Nombre variable d'arguments: construction for
On peut ecrire un script qui travaille, de la meme maniere, sur chacun des
arguments de la ligne de commande, grace a la construction for:
for NOM in <liste de mots>
do
<code a executer pour chaque mot, place successivement dans $NOM>
done
Usage frequent:
for NOM in $*
do
<code>
done
Si un ou plusieurs des arguments ont droit a un traitement special (si possible
les premiers), on peut decaler la liste avec shift
Exercice:
Re-ecrire le script precedent, pour qu'il prenne l'extension en premier
argument, et qu'ensuite il traite chacun des arguments suivants comme un
nom de fichier a renommer avec l'extension fournie.
Ca devrait suffire!