When some people need to repeat a command on several files, the first thing they think of is C shell history ( 11.5 ) :
-v  | 
%  | 
|---|
That kind of thing can be easier with the C shell's foreach loop. (In the Bourne and Korn shells, use a for ( 9.12 ) loop.) You give the loop a list of the words that will change each time the command line is run. In this example, it's a list of filenames. The loop will step through the words, one by one, storing a word into a shell variable ( 6.8 ) , then running the command(s). The loop goes on until it has read all the words. For example:
%foreach file (/usr/fran/report /usr/rob/file3 /usr/rob/file21)?cat -t -v $file | pg?end... Shell runs cat -t -v /usr/fran/report | pg ... ... Shell runs cat -t -v /usr/rob/file3 | pg ... ... Shell runs cat -t -v /usr/rob/file21 | pg ... %
 The question marks (
?
) are 
secondary prompts (
9.13
)
; the C shell will keep printing them until you type the command 
end
. Then the loop runs.
The list between the parentheses doesn't have to be filenames. Among other things, you can use 
wildcards (
1.16
)
, 
backquotes (
9.16
)
 (command substitution), 
variables (
6.8
, 
6.1
)
, and the C shell's handy 
 
curly brace (
{}
) operators (
9.5
)
. For example, you could have typed the above loop this way:
%foreach file (/usr/fran/report /usr/rob/file{3,21})?cat -t -v $file | pg?end
If you want the loop to stop before or after running each command, add the C shell operator 
$<
. It reads keyboard input and waits for a  RETURN. In this case, you can probably ignore  the input; you'll use 
$<
 to make the loop wait. For example, to make the loop above prompt before each command line:
set  | 
%  | 
|---|
The loop parameters don't need to be filenames. For instance, you could send a personalized mail ( 1.33 ) message to five people this way: [1]
[1] If you're sending lots of mail messages with a loop, your system mailer may get overloaded. In that case, it's a good idea to put a command like
sleep5( 40.2 ) on a separate line before theend. That will give the mailer five seconds to send each message.
cat -  | 
%  | 
|---|
The first line of the first letter will be "Dear John,"; the second letter "Dear Cathy,"; and so on.
Want to take this idea further? It's a part of shell programming ( 44.1 ) . I usually don't recommend ( 47.2 ) shell programming with the C shell, but this is a handy technique to use interactively.
-