حلقه until خیلی مشابه حلقه while است، به غیر از آنکه اجرای حلقه تا موقعی که TEST-COMMAND در اجرا موفق بشود، ادامه مییابد. مادامیکه این دستور ناموفق است، حلقه ادامه میدهد. ترکیب دستوری همان است که برای حلقه while بود:
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done
کد برگشتی، کد خروج آخرین دستور اجرا شده در لیست CONSEQUENT-COMMANDS است، و یا صفر است در صورتیکه فرمانی اجرا نشده باشد. TEST-COMMAND دوباره، میتواند هر دستوری با توانایی خروج با یک وضعیت موفق یا ناموفق باشد، و CONSEQUENT-COMMANDS میتواند هر دستور UNIX، اسکریپت یا ساختار شل باشد.
به طوری که پیش از این شرح دادهایم، کاراکتر « ; » هر جایی که ظاهر شود میتواند با یک یا چند کاراکتر سطر جدید جایگزین شود.
یک اسکریپت بهبود یافته picturesort.sh
( به بخشی به نام«حلقههای 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
توجه نمایید.