until 循环和 while 循环非常相似, 除了循环执行直到 TEST-COMMAND 执行成功。只要这个命令测试失败,循环就继续。语法和 while 循环一样:
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done
返回状态是最后一个在列表 CONSEQUENT-COMMANDS 中执行的命令的退出状态,或者没有执行的话就是零。 TEST-COMMAND 可以,again, 是任何能退出带成功或者失败状态的命令,而 CONSEQUENT-COMMANDS 可以是任何UNIX命令,脚本或者shell结构。
和我们先前已经解释的一样,“;” 出现的地方可以用一个或者更多新行来替代。
改进的 picturesort.sh
脚本 (参见 第 9.2.2.2 节 “嵌套while循环”),测试现存的磁盘空间。如果没有足够的磁盘空间,就删除之前月份的图片:
#!/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
列表。