除了测试命令的结果或者依赖于用户的输入来控制循环,你可以指定读取一个文件来控制循环。这样的情况下, read 经常是控制命令。只要输入行进入循环,循环命令就继续下去。一旦所有的行输入都被读取,循环就退出。
既然循环结构被认为是一个命令结构(比如 while TEST-COMMAND; do CONSEQUENT-COMMANDS; done),重定向应该在 done 语句之后出现,所以遵从这样的形式:
command <
file
这种样子的重定向也可以在其它种类的循环中起作用。
在下面的例子中,find 命令的输出被用作 read 命令的输入来控制一个 while 循环:
[carol@octarine ~/testdir]
catarchiveoldstuff.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 find $PWD -type f -a -mtime +5 | while read file do gzip "$file"; mv "$file".gz "$DESTDIR" echo "$file archived" done
文件在被移入存档目录之前就先被压缩了。