The normal Bourne shell for loop (Section 35.21) lets you take a list of items, store the items one by one in a shell variable, and loop through a set of commands once for each item:
for file in prog1 prog2 prog3 do ...process $file done
I wanted a for loop that stores several different shell variables and makes one pass through the loop for each set of variables (instead of one pass for each item, as a regular for loop does). This loop does the job:
set Section 35.25
for bunch in "ellie file16" "donna file23" "steve file34" do # PUT FIRST WORD (USER) IN $1, SECOND (FILE) IN $2... set $bunch mail $1 < $2 done
If you have any command-line arguments and still need them, store them in another variable before you use the set command. Or you can make the loop this way:
for bunch in "u=ellie f=file16 s='your files'" \ "u=donna f=file23 s='a memo'" "u=steve f=file34 s=report" do # SET $u (USER), $f (FILENAME), $s (SUBJECT): eval $bunch mail -s "$s" $u < $f done
This script uses the shell's eval (Section 27.8) command to rescan the contents of the bunch variable and store it in separate variables. Notice the single quotes, as in s='your files'; this groups the words for eval. The shell removes the single quotes before it stores the value into the s variable.
-- JP
Copyright © 2003 O'Reilly & Associates. All rights reserved.