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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إدخال 2.0 المحتوى)
(إدخال محتوى 2.1، تنسيق 3.0)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:حلقة while في Bash}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:حلقة while في Bash}}</noinclude>
تسمح حلقة while التكرارية بالتنفيذ المتكرر لقائمة أوامر طالما أن الأمر المتحكم في حلقة while يُنفَّذ بنجاح (حالة خروجه صفر). والبنية اللغوية لهذه الحلقة هي:<syntaxhighlight lang="bash">
+
 
 +
== كيفية عمل حلقة while ==
 +
تسمح حلقة <code>while</code> التكرارية بالتنفيذ المتكرر لقائمة أوامر طالما أن الأمر المتحكم في حلقة while يُنفَّذ بنجاح (حالة خروجه صفر). والبنية اللغوية لهذه الحلقة هي:<syntaxhighlight lang="bash">
 
while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done
 
while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done
</syntaxhighlight>حيث يرمز CONTROL-COMMAND -وهو الأمر الذي سيتحكم في الحلقة- إلى أي أمر يخرج بحالة فشل أو نجاح، بينما قد تكون CONSEQUENT-COMMANDS -وهي الأوامر التي ستُكرَّر- أي برنامج أو برنامج للصدفة أو أحد بُنى الصدفة المختلفة.
+
</syntaxhighlight>حيث يرمز <code>CONTROL-COMMAND</code> -وهو الأمر الذي سيتحكم في الحلقة- إلى أي أمر يخرج بحالة فشل أو نجاح، بينما قد تكون <code>CONSEQUENT-COMMANDS</code> -وهي الأوامر التي ستُكرَّر- أي برنامج أو برنامج للصدفة أو أحد بُنى الصدفة المختلفة.
 
 
وتخرج الحلقة فور فشل الأمر المتحكِّم فيها، وإن كانت الحلقة في برنامج للصدفة فإن الأمر الذي يلي عبارة done يُنفَّذ بعد انتهاء الحلقة بسبب فشل الأمر المتحكم.
 
  
تكون حالة الإعادة هي نفسها حالة الخروج لآخِر أمر من الأوامر التابعة (CONSEQUENT-COMMANDS)، أو تكون صفرًا لإن لم ينفَّذ أي أمر.
+
وتخرج الحلقة فور فشل الأمر المتحكِّم فيها، وإن كانت الحلقة في برنامج للصدفة فإن الأمر الذي يلي عبارة <code>done</code> يُنفَّذ بعد انتهاء الحلقة بسبب فشل الأمر المتحكم.
  
أمثلة
+
تكون حالة الإعادة هي نفسها حالة الخروج لآخِر أمر من الأوامر التابعة (<code>CONSEQUENT-COMMANDS</code>)، أو تكون صفرًا لإن لم ينفَّذ أي أمر.
  
مثال بسيط لاستخدام while
+
== أمثلة ==
  
إليك مثالًا بسيطًا يشرح استخدام حلقة while:<syntaxhighlight lang="bash">
+
=== مثال بسيط لاستخدام while ===
 +
إليك مثالًا بسيطًا يشرح استخدام حلقة <code>while</code>:<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
  
سطر 24: سطر 25:
 
i=$[$i+1]
 
i=$[$i+1]
 
done
 
done
</syntaxhighlight>حلقات while المتداخلة
+
</syntaxhighlight>
  
كُتب المثال التالي لنسخ صور التقطت بواسطة كاميرا ويب إلى مجلد ويب، إذ تلتقط صورة كل خمس دقائق، وكل ساعة يُنشأ مجلد جديد يحمل صور تلك الساعة، كما يُنشأ مجلد كل يوم يحتوي على 24 مجلد فرعي. يعمل البرنامج في الخلفية:<syntaxhighlight lang="bash">
+
=== حلقات while المتداخلة ===
 +
كُتب المثال التالي من أجل نسخ صور التقطت بواسطة كاميرا ويب إلى مجلد في خادم ويب، إذ تلتقط صورة كل خمس دقائق، وكل ساعة يُنشأ مجلد جديد يحمل صور تلك الساعة، كما يُنشأ مجلد كل يوم يحتوي على 24 مجلد فرعي. يعمل البرنامج في الخلفية:<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
  
سطر 49: سطر 51:
 
done
 
done
 
done
 
done
</syntaxhighlight>لاحظ استخدام عبارة true، هذا يعني: تابع التنفيذ حتى تُقاطع العملية بالقوة، عن طريق أمر kill أو ctrl+c.
+
</syntaxhighlight>لاحظ استخدام عبارة <code>true</code>، هذا يعني: تابع التنفيذ حتى تُقاطع العملية بالقوة، عن طريق أمر <code>kill</code> أو ctrl+c.
  
 
المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash">
 
المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash">
سطر 60: سطر 62:
 
sleep 300
 
sleep 300
 
done
 
done
</syntaxhighlight>لاحظ استخدام أمر date لإنشاء أنواعًا مختلفة من أسماء الملفات والمجلدات، انظر صفحات man للمزيد من الشرح.
+
</syntaxhighlight>لاحظ استخدام أمر <code>date</code> لإنشاء أنواعًا مختلفة من أسماء الملفات والمجلدات، انظر صفحات <code>man</code> للمزيد من الشرح.<blockquote>'''استخدم النظام'''</blockquote><blockquote>كان المثال السابق للشرح فقط، أما عمليات التفقّد الدورية يمكن تنفيذها باستخدام أداة <code>cron</code>. لا تنسى توجيه الخرج والأخطاء عند استخدام برامج تُنفّذ من ملف <code>crontab</code> الخاص بك!</blockquote>
 
 
استخدم النظام
 
 
 
كان المثال السابق للشرح فقط، أما عمليات التفقّد الدورية يمكن تنفيذها باستخدام أداة cron. لا تنسى توجيه الخرج والأخطاء عند استخدام برامج تُنفّذ من ملف crontab الخاص بك!
 
 
 
استخدام مُدخلات لوحة المفاتيح للتحكم في حلقة while
 
  
 +
=== استخدام مُدخلات لوحة المفاتيح للتحكم في حلقة while ===
 
يمكن تفسير البرنامج التالي بواسطة المستخدم عند إدخال ctrl+c:<syntaxhighlight lang="bash">
 
يمكن تفسير البرنامج التالي بواسطة المستخدم عند إدخال ctrl+c:<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
سطر 100: سطر 97:
  
 
done
 
done
</syntaxhighlight>يُستخدم مستند here لعرض خيارات مختلفة على المستخدم ليختار منها، وكما ذكرنا قبل قليل أن عبارة true تكرر الأوامر من قائمة الأوامر التابعة مرة بعد مرة.
+
</syntaxhighlight>يُستخدم مستند here لعرض خيارات مختلفة على المستخدم ليختار منها -مستند here أو heredoc هو طريقة لتغذية برنامج للصدفة بمحتوي قصير بدون كتابته في ملف منفصل-، وكما ذكرنا قبل قليل فإن عبارة <code>true</code> تكرر الأوامر من قائمة الأوامر التابعة مرة بعد مرة.
 
 
حساب المتوسط
 
  
 +
=== حساب المتوسط ===
 
يحسب هذا البرنامج متوسط مدخلات المستخدم والتي تُختبر قبل أن تُنفَّذ، فإن كان المُدخَل خارج النطاق فإن رسالة تُطبع بذلك، أما إن ضغط المستخدم على مفتاح q فإن الحلقة تخرج:<syntaxhighlight lang="bash">
 
يحسب هذا البرنامج متوسط مدخلات المستخدم والتي تُختبر قبل أن تُنفَّذ، فإن كان المُدخَل خارج النطاق فإن رسالة تُطبع بذلك، أما إن ضغط المستخدم على مفتاح q فإن الحلقة تخرج:<syntaxhighlight lang="bash">
 
#!/bin/bash
 
#!/bin/bash
سطر 134: سطر 130:
 
</syntaxhighlight>لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية.
 
</syntaxhighlight>لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية.
  
انظر أيضًا
+
== انظر أيضًا ==
 +
[[Bash/more advanced if usage|الاستخدامات المتقدمة لـ if في Bash]].
 +
 
 +
[[Bash/writing interactive scripts|كتابة برامج Bash تفاعلية]].
 +
 
 +
[[Bash/for loop|حلقة for في Bash]].
  
مصادر
+
== مصادر ==
 +
دليل Bash للمبتدئين، [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_02.html حلقة while في Bash].

مراجعة 13:14، 7 أغسطس 2018


كيفية عمل حلقة while

تسمح حلقة while التكرارية بالتنفيذ المتكرر لقائمة أوامر طالما أن الأمر المتحكم في حلقة while يُنفَّذ بنجاح (حالة خروجه صفر). والبنية اللغوية لهذه الحلقة هي:

while CONTROL-COMMAND; do CONSEQUENT-COMMANDS; done

حيث يرمز CONTROL-COMMAND -وهو الأمر الذي سيتحكم في الحلقة- إلى أي أمر يخرج بحالة فشل أو نجاح، بينما قد تكون CONSEQUENT-COMMANDS -وهي الأوامر التي ستُكرَّر- أي برنامج أو برنامج للصدفة أو أحد بُنى الصدفة المختلفة.

وتخرج الحلقة فور فشل الأمر المتحكِّم فيها، وإن كانت الحلقة في برنامج للصدفة فإن الأمر الذي يلي عبارة done يُنفَّذ بعد انتهاء الحلقة بسبب فشل الأمر المتحكم.

تكون حالة الإعادة هي نفسها حالة الخروج لآخِر أمر من الأوامر التابعة (CONSEQUENT-COMMANDS)، أو تكون صفرًا لإن لم ينفَّذ أي أمر.

أمثلة

مثال بسيط لاستخدام while

إليك مثالًا بسيطًا يشرح استخدام حلقة while:

#!/bin/bash

# يفتح هذا البرنامج أربع نوافذ للطرفية.

i="0"

while [ $i -lt 4 ]
do
xterm &
i=$[$i+1]
done

حلقات while المتداخلة

كُتب المثال التالي من أجل نسخ صور التقطت بواسطة كاميرا ويب إلى مجلد في خادم ويب، إذ تلتقط صورة كل خمس دقائق، وكل ساعة يُنشأ مجلد جديد يحمل صور تلك الساعة، كما يُنشأ مجلد كل يوم يحتوي على 24 مجلد فرعي. يعمل البرنامج في الخلفية:

#!/bin/bash

# ينسخ هذا البرنامج الملفات من مجلد المنزل الخاص بي إلى مجلد في خادم ويب.
# (استخدم مفاتيح ssh و scp للمجلد عن بعد)
# يُنشأ مجلد جديد في كل ساعة

PICSDIR=/home/hsoub/pics
WEBDIR=/var/www/hsoub/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

# يُنشئ هذا البرنامج ملفًا كل خمس دقائق

while true; do
touch pic-`date +%s`.jpg
sleep 300
done

لاحظ استخدام أمر date لإنشاء أنواعًا مختلفة من أسماء الملفات والمجلدات، انظر صفحات man للمزيد من الشرح.

استخدم النظام

كان المثال السابق للشرح فقط، أما عمليات التفقّد الدورية يمكن تنفيذها باستخدام أداة cron. لا تنسى توجيه الخرج والأخطاء عند استخدام برامج تُنفّذ من ملف crontab الخاص بك!

استخدام مُدخلات لوحة المفاتيح للتحكم في حلقة while

يمكن تفسير البرنامج التالي بواسطة المستخدم عند إدخال ctrl+c:

#!/bin/bash

# هذا البرنامج يطبع أمثالًا ونصائح

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 لعرض خيارات مختلفة على المستخدم ليختار منها -مستند here أو heredoc هو طريقة لتغذية برنامج للصدفة بمحتوي قصير بدون كتابته في ملف منفصل-، وكما ذكرنا قبل قليل فإن عبارة true تكرر الأوامر من قائمة الأوامر التابعة مرة بعد مرة.

حساب المتوسط

يحسب هذا البرنامج متوسط مدخلات المستخدم والتي تُختبر قبل أن تُنفَّذ، فإن كان المُدخَل خارج النطاق فإن رسالة تُطبع بذلك، أما إن ضغط المستخدم على مفتاح q فإن الحلقة تخرج:

#!/bin/bash

# احسب متوسط سلسلة أرقام.

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."

لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية.

انظر أيضًا

الاستخدامات المتقدمة لـ if في Bash.

كتابة برامج Bash تفاعلية.

حلقة for في Bash.

مصادر

دليل Bash للمبتدئين، حلقة while في Bash.