9.4. I/O 重定向和循环

9.4.1. 输入重定向

您可以使用从文件读取的输入来控制循环,而不是通过测试命令的结果或用户输入来控制循环。在这种情况下,read 通常是控制命令。只要有输入行被馈送到循环中,循环命令的执行就会继续。一旦所有输入行都被读取,循环就会退出。

由于循环结构被认为是一个命令结构 (例如 while TEST-COMMAND; do CONSEQUENT-COMMANDS; done),因此重定向应该发生在 done 语句之后,以便它符合以下形式

命令 <文件

这种重定向也适用于其他类型的循环。

9.4.2. 输出重定向

在下面的示例中,find 命令的输出用作控制 while 循环的 read 命令的输入

[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

文件在移动到存档目录之前会被压缩。