until 循环与 while 循环非常相似,不同之处在于 until 循环会一直执行,直到 TEST-COMMAND 成功执行。只要此命令失败,循环就会继续。其语法与 while 循环相同
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done
返回状态是 CONSEQUENT-COMMANDS 列表中执行的最后一个命令的退出状态,如果没有执行任何命令,则为零。TEST-COMMAND 可以再次是任何可以以成功或失败状态退出的命令,而 CONSEQUENT-COMMANDS 可以是任何 UNIX 命令、脚本或 shell 构造。
正如我们之前已经解释过的,分号 ";" 可以在其出现的任何地方替换为一个或多个换行符。
改进后的picturesort.sh脚本(参见 第 9.2.2.2 节),用于测试可用磁盘空间。如果可用磁盘空间不足,则删除前几个月的图片
#!/bin/bash
# This script copies files from my homedirectory into the webserver directory.
# A new directory is created every hour.
# If the pics are taking up too much space, the oldest are removed.
while true; do
DISKFUL=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -)
until [ $DISKFUL -ge "90" ]; do
DATE=`date +%Y%m%d`
HOUR=`date +%H`
mkdir $WEBDIR/"$DATE"
while [ $HOUR -ne "00" ]; do
DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
mkdir "$DESTDIR"
mv $PICDIR/*.jpg "$DESTDIR"/
sleep 3600
HOUR=`date +%H`
done
DISKFULL=$(df -h $WEBDIR | grep -v File | awk '{ print $5 }' | cut -d "%" -f1 -)
done
TOREMOVE=$(find $WEBDIR -type d -a -mtime +30)
for i in $TOREMOVE; do
rm -rf "$i";
done
done
|
请注意以下变量的初始化HOUR和DISKFULL变量以及将选项与 ls 和 date 命令结合使用,以便获得正确的列表用于TOREMOVE.