ITEEDU

9.3. until循环

9.3.1. 什么是until循环?

until 循环和 while 循环非常相似, 除了循环执行直到 TEST-COMMAND 执行成功。只要这个命令测试失败,循环就继续。语法和 while 循环一样:

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done

返回状态是最后一个在列表 CONSEQUENT-COMMANDS 中执行的命令的退出状态,或者没有执行的话就是零。 TEST-COMMAND 可以,again, 是任何能退出带成功或者失败状态的命令,而 CONSEQUENT-COMMANDS 可以是任何UNIX命令,脚本或者shell结构。

和我们先前已经解释的一样,“;” 出现的地方可以用一个或者更多新行来替代。

9.3.2. 例子

改进的 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

注意 HOURDISKFULL 变量的初始化以及 lsdate 带选项用法如何得到正确的 TOREMOVE 列表。