You are on page 1of 2

I/O redirection and loops

Input redirection
Instead of controlling a loop by testing the result of a command or by user input, you can specify a
file from which to read input that controls the loop. In such cases, read is often the controlling
command. As long as input lines are fed into the loop, execution of the loop commands continues.
As soon as all the input lines are read the loop exits.
Since the loop construct is considered to be one command structure (such as while TEST-
COMMAND; do CONSEQUENT-COMMANDS; done), the redirection should occur after the
done statement, so that it complies with the form
command < file

This kind of redirection also works with other kinds of loops.

Output redirection
In the example below, output of the find command is used as input for the read command
controlling a while loop:
[carol@octarine ~/testdir] cat archiveoldstuff.sh
#!/bin/bash

# This script creates a subdirectory in the current directory, to which old


# files are moved.
# Might be something for cron (if slightly adapted) to execute weekly or
# monthly.

ARCHIVENR=`date +%Y%m%d`
DESTDIR="$PWD/archive-$ARCHIVENR"

mkdir "$DESTDIR"

# using quotes to catch file names containing spaces, using read -d for more
# fool-proof usage:
find "$PWD" -type f -a -mtime +5 | while read -d $'\000' file

do
gzip "$file"; mv "$file".gz "$DESTDIR"
echo "$file archived"
done

Files are compressed before they are moved into the archive directory.
Break and continue
The break built-in
The break statement is used to exit the current loop before its normal ending. This is done when
you don't know in advance how many times the loop will have to execute, for instance because it is
dependent on user input.
The example below demonstrates a while loop that can be interrupted.

You might also like