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.