الفرق بين المراجعتين لصفحة: «Bash/while loop»
أسامه-دمراني (نقاش | مساهمات) تنسيق 3.1، إضافة تصنيفات |
أسامه-دمراني (نقاش | مساهمات) مراجعة 6: إضافة تصانيف |
||
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:حلقة while في Bash}}</noinclude> | <noinclude>{{DISPLAYTITLE:حلقة while في Bash}}</noinclude> | ||
== كيفية عمل حلقة while == | == كيفية عمل حلقة while == | ||
تسمح حلقة <code>while</code> التكرارية بالتنفيذ المتكرر لقائمة أوامر طالما أن الأمر المتحكم في حلقة while يُنفَّذ بنجاح (حالة خروجه صفر). والبنية اللغوية لهذه الحلقة هي:<syntaxhighlight lang="bash"> | تسمح حلقة <code>while</code> التكرارية بالتنفيذ المتكرر لقائمة أوامر طالما أن الأمر المتحكم في حلقة while يُنفَّذ بنجاح (حالة خروجه صفر). والبنية اللغوية لهذه الحلقة هي:<syntaxhighlight lang="bash"> | ||
سطر 22: | سطر 21: | ||
while [ $i -lt 4 ] | while [ $i -lt 4 ] | ||
do | do | ||
xterm & | xterm & | ||
i=$[$i+1] | i=$[$i+1] | ||
done | done | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 51: | سطر 50: | ||
done | done | ||
done | done | ||
</syntaxhighlight>لاحظ استخدام عبارة <code>true</code>، هذا يعني: تابع التنفيذ حتى تُقاطع العملية بالقوة، عن طريق أمر <code>kill</code> أو | </syntaxhighlight>لاحظ استخدام عبارة <code>true</code>، هذا يعني: تابع التنفيذ حتى تُقاطع العملية بالقوة، عن طريق أمر <code>kill</code> أو Ctrl+c. | ||
المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash"> | المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash"> | ||
سطر 59: | سطر 58: | ||
while true; do | while true; do | ||
touch pic-`date +%s`.jpg | touch pic-`date +%s`.jpg | ||
sleep 300 | sleep 300 | ||
done | done | ||
</syntaxhighlight>لاحظ استخدام أمر <code>date</code> لإنشاء أنواعًا مختلفة من أسماء الملفات والمجلدات، انظر صفحات <code>man</code> للمزيد من الشرح.<blockquote>'''استخدم النظام'''</blockquote><blockquote>كان المثال السابق للشرح فقط، أما عمليات التفقّد الدورية يمكن تنفيذها باستخدام أداة <code>cron</code>. لا تنسى توجيه الخرج والأخطاء عند استخدام برامج تُنفّذ من ملف <code>crontab</code> الخاص بك!</blockquote> | </syntaxhighlight>لاحظ استخدام أمر <code>date</code> لإنشاء أنواعًا مختلفة من أسماء الملفات والمجلدات، انظر صفحات <code>man</code> للمزيد من الشرح.<blockquote>'''استخدم النظام'''</blockquote><blockquote>كان المثال السابق للشرح فقط، أما عمليات التفقّد الدورية يمكن تنفيذها باستخدام أداة <code>cron</code>. لا تنسى توجيه الخرج والأخطاء عند استخدام برامج تُنفّذ من ملف <code>crontab</code> الخاص بك!</blockquote> | ||
سطر 131: | سطر 130: | ||
== انظر أيضًا == | == انظر أيضًا == | ||
[[Bash/more advanced if usage| | * [[Bash/more advanced if usage|استخدامات if المتقدمة في Bash]]. | ||
* [[Bash/writing interactive scripts|كتابة برامج Bash تفاعلية]]. | |||
[[Bash/writing interactive scripts|كتابة برامج Bash تفاعلية]]. | * [[Bash/for loop|حلقة for في Bash]]. | ||
[[Bash/for loop|حلقة for في Bash]]. | |||
== مصادر == | == مصادر == | ||
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_02.html دليل Bash للمبتدئين، صفحة حلقة while في Bash]. | |||
[[تصنيف:Bash]] | [[تصنيف:Bash]] | ||
[[تصنيف:Bash While Loop]] | [[تصنيف:Bash While Loop]] | ||
[[تصنيف:Bash Loops]] | |||
[[تصنيف:Bash Cron]] | |||
[[تصنيف:Bash Here Document]] |
المراجعة الحالية بتاريخ 00:33، 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."
لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية.