2.2. Paramètres de position et paramètres spéciaux

2.2.1. Paramètres de position

Un paramètre de position est référencé par un ou plusieurs chiffres : 8 , 0 , 23

L’assignation de valeurs à des paramètres de position s’effectue :

  • soit à l’aide de la commande interne set

  • soit lors de l’appel d’un fichier shell ou d’une fonction shell.

ATTENTION : on ne peut utiliser ni le symbole =, ni la commande interne read pour affecter directement une valeur à un paramètre de position.

$ 23=bonjour
bash: 23=bonjour : commande introuvable
$
$ read 4
bash: read: « 4 » : identifiant non valable
$

Commande interne set :

La commande interne set affecte une valeur à un ou plusieurs paramètres de position en numérotant ses arguments suivant leur position. La numérotation commence à 1.

Syntaxe : set arg1 ...

$ set alpha beta gamma => alpha est la valeur du paramètre de position 1, beta la
$                      => valeur du deuxième paramètre de position et gamma
$                      => la valeur du paramètre de position 3

Pour obtenir la valeur d’un paramètre de position, il suffit de placer le caractère $ devant son numéro ; ainsi, $1 permet d’obtenir la valeur du premier paramètre de position, $2 la valeur du deuxième et ainsi de suite.

$ set ab be ga  => numérotation des mots ab, be et ga
$
$ echo $3 $2
ga be
$
$ echo $4

$

Tous les paramètres de position sont réinitialisés dès que la commande interne set est utilisée avec au moins un argument.

$ set coucou
$ echo $1
coucou
$ echo $2
   => les valeurs be et ga précédentes ont disparu
$

La commande set -- rend indéfinie la valeur des paramètres de position préalablement initialisés.

$ set alpha beta
$ echo $1
alpha
$
$ set --
$ echo $1
   => les valeurs alpha et beta sont perdues
$

Variable prédéfinie IFS et commande interne set :

La variable prédéfinie IFS du shell contient les caractères séparateurs de mots. Par défaut, ce sont les caractères espace, tabulation et interligne. L’initialisation de IFS est effectuée par bash.

En modifiant judicieusement la valeur de IFS, il est possible avec la commande interne set de décomposer une chaîne de caractères en plusieurs mots et de les associer à des paramètres de position.

$ a=Jean:12:Rodez	=> chaîne composée de 3 champs séparés par le caractère :
$ svIFS=$IFS		=> sauvegarde de la valeur courante de IFS 
$ IFS=:			=> le caractère : devient un séparateur
$ set $a		=> substitution, décomposition en mots puis numérotation
$ IFS=$svIFS		=> restitution de la valeur originelle de IFS
$ echo "Prenom : $1, Age : $2, Ville : $3"
Prenom : Jean, Age : 12, Ville : Rodez
$

Remarques :

  • Utilisée sans argument, set a un comportement différent : elle affiche, entre autres, la (longue) liste des noms et valeurs des variables définies.

    $ set | more
    BASH=/usr/bin/bash
    . . .
    $
    

  • Si la valeur du premier argument de set commence par un caractère - ou +, une erreur se produit. En effet, les options de cette commande interne commencent par un de ces deux caractères. Pour éviter que ce type d’erreur ne se produise, on utilise la syntaxe : set -- arg ...

    $ a=+qui
    $ set $a
    bash: set: +q : option non valable
    set : utilisation :set [-abefhkmnptuvxBCHP] [-o nom-option] [--] [arg ...]
    $ set -- $a
    $
    $ echo $1
    +qui
    $
    

2.2.2. Paramètres spéciaux

Un paramètre spécial est référencé par un caractère spécial. L’affectation d’une valeur à un paramètre spécial est effectuée par le shell. Pour obtenir la valeur d’un paramètre spécial, il suffit de placer le caractère $ devant le caractère spécial qui le représente.

Un paramètre spécial très utilisé est le paramètre # (à ne pas confondre avec le début d’un commentaire). Celui-ci contient le nombre de paramètres de position ayant une valeur.

$ set a b c
$
$ echo $# 	=>; affichage de la valeur du paramètre spécial #
3 		=> il y a 3 paramètres de position ayant une valeur
$

2.2.3. Commande interne shift

La commande interne shift décale la numérotation des paramètres de position ayant une valeur.

Syntaxe : shift [ n]

Elle renomme le n+1 ème paramètre de position en paramètre de position 1, le n+2 ème paramètre de position en paramètre de position 2, etc. : (n+1) => 1 , (n+2) => 2 , etc.

Une fois le décalage effectué, le paramètre spécial # est mis à jour.

$ set a b c d e
   => 1 2 3 4 5
$ echo $1 $2 $#
a b 5
$
$ shift 2
   => a b c d e  les mots a et b sont devenus inaccessibles
   =>     1 2 3
$ echo $1 $3
c e
$ echo $#
3
$

La commande interne shift sans argument est équivalente à shift 1.

Remarque : shift ne modifie pas la valeur du paramètre de position 0 qui possède une signification particulière.

2.2.4. Paramètres de position et fichiers shell

Dans un fichier shell, les paramètres de position sont utilisés pour accéder aux valeurs des arguments qui ont été passés lors de son appel : cela signifie qu’au sein du fichier shell, les occurrences de $1 sont remplacées par la valeur du premier argument, celles de $2 par la valeur du deuxième argument, etc. Le paramètre spécial $# contient le nombre d’arguments passés lors de l’appel.

Le paramètre de position 0 contient le nom complet du programme shell qui s’exécute.

Soit le programme shell copie :

#!/bin/bash
# @(#) copie

echo "Nom du programme : $0"
echo "Nb d'arguments : $#"
echo "Source : $1"
echo "Destination : $2"
cp $1 $2

Pour exécuter ce fichier shell :

$ chmod u+x copie
$
$ copie /etc/passwd X
Nom du programme : ./copie
Nb d'arguments : 2
Source : /etc/passwd
Destination : X
$

Dans le fichier copie, chaque occurrence de $1 a été remplacée par la chaîne de caractères /etc/passwd, celles de $2 par X.

Lorsque la commande interne set est utilisée à l’intérieur d’un programme shell, la syntaxe $1 possède deux significations différentes : $1 comme premier argument du programme shell, et $1 comme premier paramètre de position initialisé par set au sein du fichier shell.

Exemple : programme shell ecrase_arg

		#!/bin/bash
		#	@(#)	ecrase_arg

		echo '$1' est $1	 =>  la chaîne $1 est remplacée par le premier argument
		set hello		 =>  set écrase la valeur précédente de $1
		echo '$1' est $1

$ ecrase_arg bonjour coucou salut
$1 est bonjour
$1 est hello
$

2.2.5. Paramètres spéciaux * et @

Les paramètres spéciaux @ et * contiennent tous deux la liste des valeurs des paramètres de position initialisés.

$ set un deux trois quatre
$
$ echo $*
un deux trois quatre
$
$ echo $@
un deux trois quatre
$

Ces deux paramètres spéciaux ont des valeurs distinctes lorsque leur référence est placée entre des guillemets ("$*" et "$@") :

"$*" est remplacée par "$1 $2 ... "

"$@" est remplacée par "$1" "$2" ...

$ set bonjour "deux coucou" salut  => trois paramètres de position sont initialisés
$						 
$ set "$*"		  	=> est équivalent à :   set  “bonjour deux coucou salut”
$
$ echo $#
1
$
$ echo $1
bonjour deux coucou salut
$

La syntaxe "$*" traite l’ensemble des paramètres de position initialisés comme une unique chaîne de caractères.

Inversement, la syntaxe "$@" produit autant de chaînes que de paramètres de positions initialisés.

$ set bonjour "deux coucou" salut     => trois paramètres de position initialisés
$	
$
$ set "$@"			=> est équivalent à :  set  “bonjour” “deux coucou” “salut”
$
$ echo $#
3
$ echo $2
deux coucou			=> l’intégrité de la chaîne a été préservée
$

Lorsque l’on souhaite mentionner dans une commande la liste des paramètres de position initialisés, il est conseillé d’utiliser la syntaxe "$@" car elle protège les éventuels caractères espace présents dans ces derniers.