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. |