9.3. until 循环

9.3.1. 是什么?

until 循环与 while 循环非常相似,不同之处在于 until 循环会一直执行,直到 TEST-COMMAND 成功执行。只要此命令失败,循环就会继续。其语法与 while 循环相同

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done

返回状态是 CONSEQUENT-COMMANDS 列表中执行的最后一个命令的退出状态,如果没有执行任何命令,则为零。TEST-COMMAND 可以再次是任何可以以成功或失败状态退出的命令,而 CONSEQUENT-COMMANDS 可以是任何 UNIX 命令、脚本或 shell 构造。

正如我们之前已经解释过的,分号 ";" 可以在其出现的任何地方替换为一个或多个换行符。

9.3.2. 示例

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

请注意以下变量的初始化HOURDISKFULL变量以及将选项与 lsdate 命令结合使用,以便获得正确的列表用于TOREMOVE.