ساختار while اجرای تکراری لیستی از دستورات را تاوقتی که دستور کنترلی حلقه while به طور موفق اجرا میشود( کد خروجش صفر است )، اجازه میدهد. ترکیب دستوری آن چنین است:
while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done
CONTROL-COMMAND میتواند هر دستور(ات)ی باشد که بتواند با کد وضعیت موفقیت یا شکست خارج گردد. CONSEQUENT-COMMANDS میتواند هر برنامه، اسکریپت یا ساختار پوسته باشد.
به مجرد اینکه CONTROL-COMMAND ناموفق شود،حلقه خارج میشود. در یک اسکریپت، دستورات پس از done اجرا میشوند.
کد برگشتی کد خروج آخرین فرمان CONSEQUENT-COMMANDS است، و یا اگر دستوری اجرا نشده باشد، صفراست.
این یک مثال برای کمحوصله:
#!/bin/bash # This script opens 4 terminal windows. i="0" while [ $i -lt 4 ] do xterm & i=$[$i+1] done
مثال زیر برای کپی تصویرهایی که با یک webcam تهیه میشوند به یک دایرکتوری شبکه، نوشته شده است. هر پنج دقیقه یک تصویر گرفته میشود. هر ساعت، یک دایرکتوری جدید برای نگهدای تصویرهای آن ساعت، ایجاد میشود. هر روز، دایرکتوری جدیدی شامل ۲۴ دایرکتوری فرعی ایجاد میشود. اسکریپت در پسزمینه اجرا میشود.
#!/bin/bash # This script copies files from my homedirectory into the webserver directory. # (use scp and SSH keys for a remote directory) # A new directory is created every hour. PICSDIR=/home/carol/pics WEBDIR=/var/www/carol/webcam while true; 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 done
به کاربرد جمله true توجه نمایید. بدین معنا که: اجرا تا موقعی که ما به طور اجباری( با kill یا Ctrl+C) اجرا را متوقف کنیم ادامه یابد.
این اسکریپت کوچک برای شبیهسازی آزمایش ما میتواند به کار رود، این اسکریپت فایلها را تولید میکند:
#!/bin/bash # This generates a file every 5 minutes while true; do touch pic-`date +%s`.jpg sleep 300 done
به استفاده از دستور date برای تولید همه انواع نام فایل و دایرکتوری توجه نمایید. برای اطلاع بیشتر صفحه man را ببینید.
استفاده از سیستم | |
---|---|
مثال قبلی به خاطر تشریح مطلب است. با استفاده از امکان cron به سهولت میتوان کنترلهای منظم را انجام داد. موقعی که اسکریپتها از crontab شما اجرا میگردند، تغییر مسیر خروجی استاندارد و خطاها را فراموش نکنید! |
این اسکریپت میتواند با ورود ترتیبی کلیدهای Ctrl+C توسط کاربر متوقف گردد:
#!/bin/bash # This script provides wisdom FORTUNE=/usr/games/fortune while true; do echo "On which topic do you want advice?" cat << topics politics startrek kernelnewbies sports bofh-excuses magic love literature drugs education topics echo echo -n "Make your choice: " read topic echo echo "Free advice on the topic of $topic: " echo $FORTUNE $topic echo done
یک here document برای ارائه انتخابهای ممکن به کاربر استفاده شده است. و دوباره، بررسی true دستورات را از لیست CONSEQUENT-COMMANDS بارها و بارها تکرار میکند.
این اسکریپت میانگین ورودی کاربر را محاسبه میکند، قبل از پردازش بررسی میشود که: اگر ورودی در محدوده نمیباشد، یک پیغام چاپ شود. اگر q فشرده شده است، حلقه خارج شود:
#!/bin/bash # Calculate the average of a series of numbers. SCORE="0" AVERAGE="0" SUM="0" NUM="0" while true; do echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE; if (("$SCORE" < "0")) || (("$SCORE" > "100")); then echo "Be serious. Common, try again: " elif [ "$SCORE" == "q" ]; then echo "Average rating: $AVERAGE%." break else SUM=$[$SUM + $SCORE] NUM=$[$NUM + 1] AVERAGE=$[$SUM / $NUM] fi done echo "Exiting."
توجه نمایید که متغیرها در سطر پایانی برای انجام محاسبات بدون نقلقولی شدن به کار رفتهاند.