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 |