Un script peut-il s'appeler récursivement? En fait, oui.
Exemple 34-6. Un script (inutile) qui s'appelle récursivement
#!/bin/bash
# recurse.sh
# Un script peut-il s'appeller récursivement?
# Oui, Mais est-ce d'une utilité quelconque?
# (Voir le script suivant.)
ECHELLE=10
MAXVAL=9
i=$RANDOM
let "i %= $ECHELLE" # Génère un nombre aléatoire entre 0 et $MAXVAL.
if [ "$i" -lt "$MAXVAL" ]
then
echo "i = $i"
./$0 # Le script lance récursivement une nouvelle instance d'elle-même.
fi # Chaque fils du script fait de même, jusqu'à ce que la valeur
#+ générée $i soit égale à $MAXVAL.
# Utiliser une boucle "while" au lieu d'un test "if/then" pose des problèmes.
# Expliquez pourquoi.
exit 0 |
Exemple 34-7. Un script (utile) qui s'appelle récursivement
#!/bin/bash
# pb.sh: carnet de téléphones.
# Ecrit par Rick Boivie, et utilisé avec sa permission.
# Modifications par l'auteur du document.
MINARGS=1 # Le script a besoin d'au moins un argument.
FICHIERDONNEES=./carnet_telephone
NOMPROG=$0
E_SANSARGS=70 # Erreur lorsque sans arguments.
if [ $# -lt $MINARGS ]; then
echo "Usage: "$NOMPROG" donnees"
exit $E_SANSARGS
fi
if [ $# -eq $MINARGS ]; then
grep $1 "$FICHIERDONNEES"
else
( shift; "$NOMPROG" $* ) | grep $1
# Le script s'appelle récursivement.
fi
exit 0 # Le script sort ici.
# On peut mettre des commentaires sans '#' et des données après
#+ ce point.
# ------------------------------------------------------------------------
# Exemple d'un carnet d'adresses:
John Doe 1555 Main St., Baltimore, MD 21228 (410) 222-3333
Mary Moe 9899 Jones Blvd., Warren, NH 03787 (603) 898-3232
Richard Roe 856 E. 7th St., New York, NY 10009 (212) 333-4567
Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678
Zoe Zenobia 4481 N. Baker St., San Franciso, SF 94338 (415) 501-1631
# ------------------------------------------------------------------------
$bash pb.sh Roe
Richard Roe 856 E. 7th St., New York, NY 10009 (212) 333-4567
Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678
$bash pb.sh Roe Sam
Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678
# Lorsqu'au moins un argument est passé au script, celui-ci n'affiche *que*
#+ le(s) ligne(s) contenant tous les arguments. |
![]() | Trop de niveaux de récursivité peut vider la pile du script, causant une erreur de segmentation (segfault). |
| Précédent | Sommaire | Suivant |
| Tests et comparaisons: Alternatives | Niveau supérieur | << Coloriser >> des scripts |