Can a script recursively call itself? Indeed.
Example 34-6. A (useless) script that recursively calls itself
#!/bin/bash
# recurse.sh
# Can a script recursively call itself?
# Yes, but is this of any practical use?
# (See the following script.)
RANGE=10
MAXVAL=9
i=$RANDOM
let "i %= $RANGE" # Generate a random number between 0 and $MAXVAL.
if [ "$i" -lt "$MAXVAL" ]
then
echo "i = $i"
./$0 # Script recursively spawns a new instance of itself.
fi # Each child script does the same, until
#+ a generated $i equals $MAXVAL.
# Using a "while" loop instead of an "if/then" test causes problems.
# Explain why.
exit 0 |
Example 34-7. A (useful) script that recursively calls itself
#!/bin/bash
# pb.sh: phone book
# Written by Rick Boivie, and used with permission.
# Modifications by document author.
MINARGS=1 # Script needs at least one argument.
DATAFILE=./phonebook
PROGNAME=$0
E_NOARGS=70 # No arguments error.
if [ $# -lt $MINARGS ]; then
echo "Usage: "$PROGNAME" data"
exit $E_NOARGS
fi
if [ $# -eq $MINARGS ]; then
grep $1 "$DATAFILE"
else
( shift; "$PROGNAME" $* ) | grep $1
# Script recursively calls itself.
fi
exit 0 # Script exits here.
# It's o.k. to put non-hashmarked comments
#+ and data after this point.
# ------------------------------------------------------------------------
# Sample "phonebook" datafile:
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
# When more than one argument passed to script,
#+ prints *only* the line(s) containing all the arguments. |
![]() | Too many levels of recursion can exhaust the script's stack space, causing a segfault. |