|
|
In the previous examples in this section, the commands in shell programs have been executed in sequence. The for and while looping constructs allow a program to execute a command or sequence of commands several times.
The for loop executes a sequence of commands once for each member of a list. It has the format shown in ``Format of the for loop construct''.
for variable
in a_list_of_values
do
command_1
command_2
.
.
.
last_command
done
Format of the for loop construct
For each iteration of the loop, the next member of the list is assigned to the variable given in the for clause. References to that variable may be made anywhere in the commands within the do clause.
It is easier to read a shell program if the looping constructs are visually clear. Because the shell ignores spaces at the beginning of lines, each section of a command can be indented as it was in the above format. Also, if you indent each command section, you can easily check to make sure each do has a corresponding done at the end of the loop.
The variable can be any name you choose. For example, if you call it var, then the values given in the list after the keyword in will be assigned in turn to var; references within the command list to $var will make the value available. If the in clause is omitted, the values for var will be the complete set of arguments given to the command and available in the special parameter ``$*''. The command list between the keywords do and done will be executed once for each value.
When the commands have been executed for the last value in the list, the program will execute the next line below done. If there is no line, the program will end.
The easiest way to understand a shell programming construct is to try an example. Create a program that will move files to another directory. Include the following commands for the purposes shown.
do
mv $file $path/$file
done
$ cat mv.file
echo Please type in the directory path
read path
for file
in memo1 memo2 memo3
do
mv $file $path/$file
done
$
In this program the values
for the variable file
are already in the program.
To change the files
each time the program is invoked,
assign the values
using positional parameters
or the read command.
When positional parameters are used,
the in keyword
is not needed,
as the next screen shows:
$ cat mv.file
echo type in the directory path
read path
for file
do
mv $file $path/$file
done
$
You can move several files at once with this command by
specifying a list of filenames as arguments
to the command.
(This can be done most easily using the filename
expansion mechanism described earlier).
Another loop construct, the while loop, uses two groups of commands. It will continue executing the sequence of commands in the second group, the do . . . done list, as long as the final command in the first group, the while list, returns a status of (true), meaning the statements after the do can be executed.
The general format of the while loop is shown in ``Format of the while loop construct''.
while
command_1
.
.
.
last_command
do
command_1
.
.
.
last_command
done
Format of the while loop construct
For example, a program called enter.name uses a while loop to enter a list of names into a file. The program consists of the following command lines:
$ cat enter.name
while
read x
do
echo $x>>xfile
done
$
With some added refinements, the program becomes:
$ cat enter.name
echo "Please type in each person's name and then a <Return>"
echo "Please end the list of names with a CTRL-d"
while read x
do
echo $x>>xfile
done
echo xfile contains the following names:
cat xfile
$
Notice that, after the loop is completed,
the program executes the
commands below the done.
You used special characters in the first two echo command lines, so you must use quotes to turn off the special meaning. The next screen shows the results of enter.name:
$ enter.name Please type in each person's name and then a <Return> Please end the list of names with a CTRL-dNotice that after the loop completes, the program prints all the names contained in xfile.
Mary Lou
Janice
<CTRL-d> xfile contains the following names: Mary Lou Janice $
The file system has a file called /dev/null where you can have the shell deposit any unwanted output.
Try /dev/null by ignoring the results of the who command. First, type in the who command. The response tells you who is on the system. Now, try the who command, but redirect the output into /dev/null:
who > /dev/nullNotice the system responded with a prompt. The output from the who command was placed in /dev/null and was effectively discarded.