الفرق بين المراجعتين لصفحة: «Bash/until loop»
أسامه-دمراني (نقاش | مساهمات) طلا ملخص تعديل |
لا ملخص تعديل |
||
سطر 3: | سطر 3: | ||
تشبه هذه الحلقةُ التكرارية حلقةَ <code>while</code> باستثناء أن الحلقة هنا تُنفَّذ إلى أن يُنفَّذ أمر اختباري <code>TEST-COMMAND</code> بنجاح، فتظل الحلقة عاملة طالما كان تنفيذ الأمر الاختباري يفشل. والبنية اللغوية لها تشبه البنية اللغوية لحلقة <code>while</code> :<syntaxhighlight lang="bash"> | تشبه هذه الحلقةُ التكرارية حلقةَ <code>while</code> باستثناء أن الحلقة هنا تُنفَّذ إلى أن يُنفَّذ أمر اختباري <code>TEST-COMMAND</code> بنجاح، فتظل الحلقة عاملة طالما كان تنفيذ الأمر الاختباري يفشل. والبنية اللغوية لها تشبه البنية اللغوية لحلقة <code>while</code> :<syntaxhighlight lang="bash"> | ||
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done | until TEST-COMMAND; do CONSEQUENT-COMMANDS; done | ||
</syntaxhighlight>وحالة الإعادة لهذه الحلقة هي نفسها حالة الخروج لآخر أمر يُنفَّذ من الأوامر التابعة <code>CONSEQUENT-COMMANDS</code> أو تكون صفرًا إن لم يُنفَّذ أي أمر. وقد يكون الأمر الاختباري <code>TEST-COMMAND</code> | </syntaxhighlight>وحالة الإعادة لهذه الحلقة هي نفسها حالة الخروج لآخر أمر يُنفَّذ من الأوامر التابعة <code>CONSEQUENT-COMMANDS</code> أو تكون صفرًا إن لم يُنفَّذ أي أمر. وقد يكون الأمر الاختباري <code>TEST-COMMAND</code> أي أمر يمكن أن يخرج بحالة نجاح أو فشل، وكذلك فإن الأوامر التابعة قد تكون أيًا من أوامر يونكس أو برامج نصية أو إحدى بُنى الصدَفة. | ||
يمكن أن تستبدل الفاصلة المنقوطة "<code>;</code>" بسطر جديد أو أكثر إن دعت الحاجة | يمكن أن تستبدل الفاصلة المنقوطة "<code>;</code>" بسطر جديد أو أكثر إن دعت الحاجة |
مراجعة 06:39، 5 سبتمبر 2018
كيفية عمل حلقة until
تشبه هذه الحلقةُ التكرارية حلقةَ while
باستثناء أن الحلقة هنا تُنفَّذ إلى أن يُنفَّذ أمر اختباري TEST-COMMAND
بنجاح، فتظل الحلقة عاملة طالما كان تنفيذ الأمر الاختباري يفشل. والبنية اللغوية لها تشبه البنية اللغوية لحلقة while
:
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done
وحالة الإعادة لهذه الحلقة هي نفسها حالة الخروج لآخر أمر يُنفَّذ من الأوامر التابعة CONSEQUENT-COMMANDS
أو تكون صفرًا إن لم يُنفَّذ أي أمر. وقد يكون الأمر الاختباري TEST-COMMAND
أي أمر يمكن أن يخرج بحالة نجاح أو فشل، وكذلك فإن الأوامر التابعة قد تكون أيًا من أوامر يونكس أو برامج نصية أو إحدى بُنى الصدَفة.
يمكن أن تستبدل الفاصلة المنقوطة ";
" بسطر جديد أو أكثر إن دعت الحاجة
أمثلة
هذا البرنامج نسخة مطوّرة من المثال الذي ذكرناه في حلقة while، وهذه النسخة تتفقد وجود مساحة كافية على القرص، فإن لم تجد فإنها تحذف صورًا من الأشهر السابقة:
#!/bin/bash
# ينسخ هذا البرنامج الصور من مجلد المنزل الخاص بي إلى مجلد في خادم ويب
# يُنشأ مجلد جديد في كل ساعة
# إن كانت الصور تحتل مساحة كبيرة بحيث لا يمكن إضافة جديد، فإن آخر نسخة احتياطية تُحذف.
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
وDISKFUL
واستخدام الخيارات مع أمري ls
و date
من أجل الحصول على اختيار دقيق لأمر TOREMOVE
.
انظر أيضًا
مصادر
- دليل Bash للمبتدئين. حلقة until التكرارية.