La gestion des paramètres sous Bash

Cette article présente la façon la plus connue de gérer les paramètres dans un script Bash. Cette manière de faire est intéressante car elle est simple et rapide à mettre en place.

Avant de commencer et si cela est nécessaire, voici un rappel sur la différence qu’il y a entre un paramètre et une option.

Création du script

Créer le script en indiquant l’interpréteur à utiliser (bash), puis le rendre exécutable :

echo "#!/bin/bash" > test.bash
chmod u+x test.bash

Gestion des paramètres un à un

Les paramètres sont accessibles via les variables spéciales $1, $2, $3, … (n+1 pour chaque paramètre supplémentaire). Attention au delà du neuvième paramètres il est nécessaire d’utiliser la forme avec des accolades, par exemple ${10}. Voici un exemple d’affichage des paramètres :

# afficher les parametres
echo "premier parametre :  $1"
echo "deuxieme parametre : $2"

Ce qui donne à l’exécution :

./test.bash foo bar
premier parametre :  foo
deuxieme parametre : bar

Gestion des paramètres dans un boucle

Lorsqu’un script traite successivement et de la même manière l’ensemble des paramètres dont la quantité n’est pas connue à l’avance (un paramètre, ou deux, ou trois, ou …) , il peut être plus simple d’en parser directement la liste grâce à la variable spéciale $@ :

for param in "$@"; do
  echo $param
done

Ce qui donne :

./test.bash foo bar 'baz qux'
foo
bar
baz qux

Décalage des paramètres

Une autre manière de travailler consiste à utiliser la commande shift pour décaler les paramètres. En résumé, lorsqu’un traitement sur un (ou plusieurs) paramètre(s) est fait, on s’en débarrasse(nt) pour passer au suivant. Voici un exemple qui illustre le principe :

echo "1er parametre :  $1"
echo "2eme parametre : $2"

echo "decalage de 1"
shift

echo "1er parametre :  $1"
echo "2eme parametre : $2"

echo "decalage de 2"
shift 2

echo "1er parametre :  $1"
echo "2eme parametre : $2"

Ce qui donne :

./test.bash 1 2 3 4 5
1er parametre :  1
2eme parametre : 2
decalage de 1
1er parametre :  2
2eme parametre : 3
decalage de 2
1er parametre :  4
2eme parametre : 5

Les autres variables utiles

Il existe d’autres variables spéciales qui peuvent être utile pour récupérer :

  • le nombre de paramètres $#
  • la liste des paramètres dans une string $* (attention cette variable est différente de $@ qui récupére les paramètres dans une liste)
  • le nom du script $0
echo "Le script '$0' affiche '$#' parametre(s)"
echo "qui sont '$*'"

Ce qui donne :

./test.bash foo bar baz
Le script './test.bash' affiche '3' parametre(s)
qui sont 'foo bar baz'

Pour des scripts plus élaborés

Si cette façon de faire est intéressante, elle atteint rapidement ces limites lorsqu’il faut une gestion des arguments plus complexe. Imaginez une commande prenant un paramètre mais qui a une dizaine d’options avec ou sans paramètres. Bien sur il faut réussir à implémenter toutes ces possibilités sans tenir compte de l’ordre des options et ne surtout pas oublier de gérer des erreurs de saisie de l’usager …

# fonctionnement nominal
test param
# afficher l'aide du programme
test -h
# utiliser une option qui a un parametre
test -a paramA param
# utiliser deux options avec un parametre et une option sans
test -a paramA -b -c paramC param
# gerer les erreurs de saisie (ex : manque le parametre de l'option -a)
test -a param

Cela peut très vite devenir une usine à gaz, donc à partir du moment ou les arguments sont nombreux et facultatifs, il est préférable de s’orienter vers une solution plus adaptée. Une solution possible, qui sera abordée dans un prochain article, est la primitive du bash getopts.

Vous avez aimé ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

19 + 6 =