الفرق بين المراجعتين ل"Bash/until loop"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إدخال 1.0، عنوان الصفحة)
 
(مراجعة 6: إضافة تصانيف)
 
(6 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:حلقة until في Bash}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:حلقة until في Bash}}</noinclude>
 +
== كيفية عمل حلقة until ==
 +
تشبه هذه الحلقةُ التكرارية حلقةَ <code>while</code> باستثناء أن الحلقة هنا تُنفَّذ إلى أن يُنفَّذ أمر اختباري <code>TEST-COMMAND</code> بنجاح، فتظل الحلقة عاملة طالما كان تنفيذ الأمر الاختباري يفشل. والبنية اللغوية لها تشبه البنية اللغوية لحلقة <code>while</code> :<syntaxhighlight lang="bash">
 +
until TEST-COMMAND; do CONSEQUENT-COMMANDS; done
 +
</syntaxhighlight>وحالة الإعادة لهذه الحلقة هي نفسها حالة الخروج لآخر أمر يُنفَّذ من الأوامر التابعة <code>CONSEQUENT-COMMANDS</code> أو تكون صفرًا إن لم يُنفَّذ أي أمر. وقد يكون الأمر الاختباري <code>TEST-COMMAND</code> أي أمر يمكن أن يخرج بحالة نجاح أو فشل، وكذلك فإن الأوامر التابعة قد تكون أيًا من أوامر يونكس أو برامج نصية أو إحدى بُنى الصدَفة.
 +
 +
يمكن أن تستبدل الفاصلة المنقوطة "<code>;</code>" بسطر جديد أو أكثر إن دعت الحاجة
 +
 +
== أمثلة ==
 +
هذا البرنامج نسخة مطوّرة من المثال الذي ذكرناه في [[Bash/while loop#.D8.AD.D9.84.D9.82.D8.A7.D8.AA while .D8.A7.D9.84.D9.85.D8.AA.D8.AF.D8.A7.D8.AE.D9.84.D8.A9|حلقات while المتداخلة]]، وهذه النسخة تتفقد وجود مساحة كافية على القرص، فإن لم تجد فإنها تحذف صورًا من الأشهر السابقة:<syntaxhighlight lang="bash">
 +
#!/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
 +
 +
</syntaxhighlight>لاحظ بدء متغيرات <code>HOUR</code> و<code>DISKFUL</code> واستخدام الخيارات مع أمري <code>ls</code> و <code>date</code> من أجل الحصول على اختيار دقيق لأمر <code>TOREMOVE</code>.
 +
 +
== انظر أيضًا ==
 +
* [[Bash/types of variables|أنواع المتغيرات في Bash]].
 +
* [[Bash/array variables|المصفوفات في Bash]].
 +
* [[Bash/operations on variables|العمليات على المتغيرات في Bash]].
 +
 +
== مصادر ==
 +
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_03.html دليل Bash للمبتدئين، صفحة حلقة until التكرارية.]
 +
[[تصنيف:Bash]]
 +
[[تصنيف:Bash Until Loop]]
 +
[[تصنيف:Bash Loops]]

المراجعة الحالية بتاريخ 00:35، 7 سبتمبر 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.

انظر أيضًا

مصادر