Une compilation de documentations   { en , fr }

Accéder facilement aux arguments d'un script bash

Étiquettes:
Créé en:
Dernière modification:
Auteur:
Xavier Béguin

Attention, les fonctionnalités présentées ici sont spécifiques à l'interpréteur bash, et ne fonctionneront pas dans d'autres interpréteurs, en particulier ceux qui se limitent aux fonctionnalités définies dans la norme POSIX (ou lorsque bash est exécuté en mode POSIX).

Accéder à un paramètre positionnel indexé sur le dernier argument

Dans un script ou une fonction shell, on a souvent besoin d'accéder à un argument qui lui a été passé. C'est simple quand on connaît précisément son indice dans la liste des arguments, grâce aux variables $1, $2, ...

Mais ces arguments sont également accessibles via les tableaux $@ et $*. Grâce aux fonctionnalités spécifiques à l'interpréteur bash, il est ainsi possible, entre autres, d'accéder à un paramètre dont on connaît la position depuis la fin de la liste des paramètres. Par exemple :

bash$ function f() {
    echo "mon avant-dernier paramètre est '${*: -2:1}'"
}
bash$ f un deux trois	
mon avant-dernier paramètre est 'deux'

Attention : il ne faut pas oublier de placer une espace entre le deux-points et le tiret, pour éviter que bash ne confonde avec :-, qui représente l’utilisation de valeur par défaut.

Autres possibilités similaires

Lecture d'arguments à l'aide de chaînes de caractères

Voici quelques exemples où l'on récupère une chaîne de caractères contenant un ou plusieurs paramètres positionnels (séparés par le premier caractères de la variables IFS – ou une espace si celle-ci n'est pas définie –, comme c'est toujours le cas entre des guillemets doubles avec les tableaux indicés par * ou avec $*) :

  • ici, on initialise puis affiche ici la chaîne de caractères s qui contiendra le dernier paramètre positionnel de la fonction f :
    bash$ function f() { s="${*: -1}"; echo "$s"; }
    bash$ f un deux trois
    trois
    
  • là, la chaîne de caractères s contiendra les deux derniers arguments (séparés par une espace) :
    bash$ function f() { s="${*: -2:2}"; echo "$s"; }
    bash$ f un deux trois quatre
    deux trois
    

Lecture d'arguments à l'aide de tableaux

Et ci-dessous figurent quelques exemples où l'on initialise un tableau contenant un ou plusieurs paramètres positionnels (résultant de l'expansion habituelle entre des guillements doubles de tableaux indicés par @ ou avec $@) avant d'afficher l'ensemble de leurs éléments (séparés par une espace) :

  • ci-dessous, t représente un tableau avec 2 paramètres positionnels à partir du deuxième paramètre de la fonction, c'est à dire l'équivalent de t=("$2" "$3") :
bash$ function f() { t=("${@:2:2}"); echo "${t[*]}"; }
bash$ f un deux trois quatre
deux trois
  • ici, t sera un tableau contenant deux paramètres positionnels consécutifs, dont le premier est le troisième argument de la fonction en comptant à l'envers à partir du dernier :
bash$ function f() { t=("${@: -3:2}"); echo "${t[*]}"; }
bash$ f un deux trois quatre cinq
trois quatre
  • enfin, dans ce dernier exemple, t sera contenant les cinq derniers arguments positionnels de la fonction (le tableau sera vide si celle-ci a moins de 5 arguments):
bash$ function f() { t=("${@: -5}"); echo "${t[*]}"; }
bash$ f un deux trois

bash$ f un deux trois quatre cinq six sept
trois quatre cinq six sept