The Bourne shell
for
loop is like the C shell
foreach
loop (
9.11
)
:
it loops through a list of words, running one or more commands for each
word in the list.
This saves time when you want to run the same series of commands,
separately, on several files.
Let's use the example from the article about
foreach
:
$
for file in /usr/fran/report /usr/rob/file2 /usr/rob/file3
>
do
>
cat -t -v $file | pg
>
done
...
Shell runs cat -t -v /usr/fran/report | pg
...
...
Shell runs cat -t -v /usr/rob/file2 | pg
...
...
Shell runs cat -t -v /usr/rob/file3 | pg
...
$
The right angle brackets (
>
) are
secondary prompts (
9.13
)
;
the Bourne shell will keep printing them until you type the command
done
.
Then it runs the loop.
You don't have to press RETURN after the
do
; you can type the
first command on the same line after it.
In a shell script, the loop body (the lines between
do
and
done
) are usually indented for clarity.
The list after the
in
doesn't have to be filenames.
Among other things, you can use
backquotes (
9.16
)
(command substitution),
variables (
6.8
,
6.1
)
,
or
wildcards (
15.1
)
.
For example, you could have typed the above loop this way:
$
for file in /usr/fran/report /usr/rob/file[23]
>
do cat -t -v $file | pg
>
done
If you want the loop to stop before or after running each command, add the
Bourne shell
read
command (
44.13
)
.
It reads keyboard input and waits for a
RETURN.
In this case, you can probably ignore the input; you'll use
read
to
make the loop wait.
For example, to make the above loop prompt before each command line:
$
for file in /usr/fran/report /usr/rob/file[23]
>
do
>
echo -n "Press RETURN to see $file-"
>
read x
>
cat -t -v $file | pg
>
done
Press RETURN to see /usr/fran/report-
[RETURN]
Shell runs cat -t -v /usr/fran/report | pg
...
Press RETURN to see /usr/rob/file2-
[RETURN]
Shell runs cat -t -v /usr/rob/file2 | pg
...
Press RETURN to see /usr/rob/file3-
[RETURN]
Shell runs cat -t -v /usr/rob/file3 | pg
...
Article
44.16
has more information about the
for
loop.
Article
45.16
shows how to make a
for
loop read the standard input instead of a
list of arguments.