您可以使用从文件读取的输入来控制循环,而不是通过测试命令的结果或用户输入来控制循环。在这种情况下,read 通常是控制命令。只要有输入行被馈送到循环中,循环命令的执行就会继续。一旦所有输入行都被读取,循环就会退出。
由于循环结构被认为是一个命令结构 (例如 while TEST-COMMAND; do CONSEQUENT-COMMANDS; done),因此重定向应该发生在 done 语句之后,以便它符合以下形式
命令 <文件
这种重定向也适用于其他类型的循环。
在下面的示例中,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 |
文件在移动到存档目录之前会被压缩。