Unix Power Tools
Making a for Loop with Multiple Variables
by Jerry Peek
02/10/2000
The normal Bourne shell
for loop
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:
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 do that.
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
command to re-scan the contents of the
bunch variable and store it in separate variables.
Notice the single quotes like s='your files'; this groups the
words for eval.
The shell removes those single quotes before it stores the value into
the s variable.
More Unix Power Tools