Comme pour les programmes shell, bash permet l’écriture de fonctions récursives.
Le programme fctfactr implante le calcul d’une factorielle sous la forme d’une fonction shell factr récursive. Outre la récursivité, ce programme illustre :
#!/bin/bash # @(#) fctfactr shopt -s extglob if (( $# != 1 )) || [[ $1 != +([0-9]) ]] then echo "syntaxe : fctfactr n" >&2 exit 1 fi function factr { local -i n if (( $1 == 0 )) then echo 1 else (( n=$1-1 )) n=$( factr $n ) # appel recursif echo $(( $1 * $n )) fi } factr $1
$ fctfactr syntaxe : fctfactr n $ fctfactr euzte12uz syntaxe : fctfactr n $ fctfactr 1 1 $ fctfactr 4 24 $
Remarque :
par défaut, le nombre d’appels imbriqués d’une fonction récursive est illimité. Toutefois, il est possible d’utiliser la variable prédéfinie du shell FUNCNEST pour limiter ce nombre. Il suffit d’affecter à cette variable le nombre maximal d’appels souhaité. Lorsque cette limite est dépassée, le programme shell s’arrête et un message d’erreur est affiché.
Il est fortement recommandé d’utiliser la variable prédéfinie FUNCNEST dans un programme shell et non dans un shell interactif car cette variable peut perturber le fonctionnement de ce dernier.
Le programme shell fctfactr1 est une version du programme shell précédent fctfactr où le nombre d’invocations a été limité à 3.
#!/bin/bash # @(#) fctfactr1 function factr { local -i n if (( $1 == 0 )) then echo 1 else (( n=$1-1 )) n=$( factr $n ) echo $(( $1 * $n )) fi } FUNCNEST=3 factr $1
$ fctfactr1 2 2 => le nombre d’appels imbriqués n’a pas été dépassé $ $ fctfactr1 8 ./fctfactr1: ligne 13: factr : dépassement de la profondeur maximum d'imbrication de fonctions (3) 0 $