Que fait une variable << locale >>?
Une variable déclarée localement n'est visible qu'à l'intérieur du bloc de code dans laquelle elle apparaît. Elle a une << visibilité >> locale. Dans une fonction, une variable locale n' a une signification qu'à l'intérieur du bloc de la fonction.
Exemple 23-8. Visibilité de la variable locale
#!/bin/bash
fonc ()
{
local var_local=23 # Déclaré en local.
echo
echo "\"var_local\" dans la fonction = $var_local"
var_global=999 # Non déclaré en local.
echo "\"var_global\" dans la fonction = $var_global"
}
fonc
# Maintenant, voyons si il existe une variable locale en dehors de la fonction.
echo
echo "\"var_loc\" en dehors de la fonction = $var_loc"
# "var_loc" en dehors de la fonction =
# Non, $var_local n'est pas visible.
echo "\"var_global\" en dehors de la fonction = $var_global"
# "var_global" en dehors de la fontion = 999
# $var_global est visible globalement.
echo
exit 0 |
![]() | Avant qu'une fonction ne soit appelée, toutes les variables déclarées dans la fonction sont invisibles à l'extérieur du corps de la fonction, et pas seulement celles déclarées explicitement locales.
|
Les variables locales permettent la récursion, [1] mais cette pratique implique généralement beaucoup de calculs supplémentaires et n'est vraiment pas recommendée dans un script shell. [2]
Exemple 23-9. Récursion, en utilisant une variable locale
#!/bin/bash
# facteurs
# ---------
# Bash permet-il la récursion?
# Eh bien, oui, mais...
# Vous devrez vous accrocher pour y arriver.
MAX_ARG=5
E_MAUVAIS_ARGS=65
E_MAUVAISE_ECHELLE=66
if [ -z "$1" ]
then
echo "Usage: `basename $0` nombre"
exit $E_MAUVAIS_ARGS
fi
if [ "$1" -gt $MAX_ARG ]
then
echo "En dehors de l'échelle (5 est le maximum)."
# Maintenant, allons-y.
# Si vous souhaitez une échelle plus importante, réécrivez-le dans un vrai
# langage de programmation.
exit $E_MAUVAISE_ECHELLE
fi
fact ()
{
local nombre=$1
# La variable "nombre" doit être déclarée en local.
# Sinon cela ne fonctionne pas.
if [ "$nombre" -eq 0 ]
then
factoriel=1 # Le factoriel de 0 = 1.
else
let "decrnum = nombre - 1"
fact $decrnum # Appel à la fonction récursive.
let "factoriel = $nombre * $?"
fi
return $factoriel
}
fact $1
echo "Le factoriel de $1 est $?."
exit 0 |
Voir aussi Exemple A-17 pour un exemple de récursion dans un script. Faites attention que la récursion demande beaucoup de ressources et s'exécute lentement. Son utilisation n'est donc pas appropriée dans un script.
| [1] | Herbert Mayer définit la récursion comme << ...l'expression d'un algorithme utilisant une version plus simple de ce même algorithme... >> Une fonction récursive s'appelle elle-même. | |
| [2] | Trop de niveaux de récursion pourrait arrêter brutalement un script avec une erreur de segmentation.
|
| Précédent | Sommaire | Suivant |
| Fonctions complexes et complexité des fonctions | Niveau supérieur | Alias |