14.4. Arguments d’une fonction

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é
$