Bash V

Scripts non triviaux

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:

Les conditions que reconnait test sont orientees vers les fichiers:
Il existe aussi des operateurs pour comparer des "chaines" (toutes les variables sont evaluees non comme des nombres, mais comme des chaines de caracteres):
Lorsque des chaines peuvent etre evaluees comme entiers:
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!