Les arguments d’une fonction sont référencés dans son corps de la même manière que les arguments d’un programme shell le sont : $1 référence le premier argument, $2 le deuxième, etc., $# le nombre d’arguments passés lors de l’appel de la fonction.
Le paramètre spécial $0 n’est pas modifié : il contient le nom du programme shell.
Pour éviter toute confusion avec les paramètres de position qui seraient éventuellement initialisés dans le code appelant la fonction, la valeur de ces derniers est sauvegardée avant l’appel à la fonction puis restituée après exécution de la fonction.
Le programme shell args illustre ce mécanisme de sauvegarde/restitution :
#!/bin/bash # @(#) args function f { echo " --- Dans f : \$0 : $0" echo " --- Dans f : \$# : $#" echo " --- Dans f : \$1 : $1" # affichage du 1er argument de la fonction f } echo "Avant f : \$0 : $0" echo "Avant f : \$# : $#" echo "Avant f : \$1 : $1" # affichage du 1er argument du programme args f pierre paul jacques echo "Apres f : \$1 : $1" # affichage du 1er argument du programme args
$ args un deux trois quatre Avant f : $0 : ./args => nom du programme Avant f : $# : 4 => nombre d’arguments passés à args Avant f : $1 : un => 1er argument passé à args --- Dans f : $0 : ./args --- Dans f : $# : 3 => pierre paul jacques --- Dans f : $1 : pierre => 1er argument passé à la fonction f Apres f : $1 : un => les arguments passés à args ont été restitués $
Utilisée dans le corps d’une fonction, la commande interne shift décale la numérotation des paramètres de position internes à la fonction.
#!/bin/bash # @(#) argsShift function f { echo " --- Dans f : Avant 'shift 2' : \$* => $*" shift 2 echo " --- Dans f : Apres 'shift 2' : \$* => $*" } echo Appel : f un deux trois quatre f un deux trois quatre
$ argsShift Appel : f un deux trois quatre --- Dans f : Avant 'shift 2' : $* => un deux trois quatre --- Dans f : Apres 'shift 2' : $* => trois quatre $
Après exécution de la commande shift 2, les arguments un et deux sont devenus inaccessibles.
Qu’elle soit utilisée dans une fonction ou à l’extérieur de celle-ci, la commande interne set modifie toujours la valeur des paramètres de position.
#!/bin/bash # @(#) argsSet function f { echo " -- Dans f : Avant execution de set \$(date) : \$* => $*" set $(date) echo " -- Dans f : Apres execution de set \$(date) : \$* => $*" } echo "Avant f : \$* => $*" echo Appel : f alpha beta f alpha beta echo "Apres f : \$* => $*"
$ argsSet un Avant f : $* => un Appel : f alpha beta -- Dans f : Avant execution de set $(date) : $* => alpha beta -- Dans f : Apres execution de set $(date) : $* => mer. 09 févr. 2022 10:57:54 CET Apres f : $* => un => l’argument a été convenablement sauvegardé puis restitué $