الفرق بين المراجعتين ل"Bash/while loop"
أسامه-دمراني (نقاش | مساهمات) (إدخال 2.0 المحتوى) |
أسامه-دمراني (نقاش | مساهمات) (مراجعة 6: إضافة تصانيف) |
||
(6 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 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 يُنفَّذ بعد انتهاء الحلقة بسبب فشل الأمر المتحكم. | + | وتخرج الحلقة فور فشل الأمر المتحكِّم فيها، وإن كانت الحلقة في برنامج للصدفة فإن الأمر الذي يلي عبارة <code>done</code> يُنفَّذ بعد انتهاء الحلقة بسبب فشل الأمر المتحكم. |
− | تكون حالة الإعادة هي نفسها حالة الخروج لآخِر أمر من الأوامر التابعة (CONSEQUENT-COMMANDS)، أو تكون صفرًا لإن لم ينفَّذ أي أمر. | + | تكون حالة الإعادة هي نفسها حالة الخروج لآخِر أمر من الأوامر التابعة (<code>CONSEQUENT-COMMANDS</code>)، أو تكون صفرًا لإن لم ينفَّذ أي أمر. |
− | أمثلة | + | == أمثلة == |
− | مثال بسيط لاستخدام while | + | === مثال بسيط لاستخدام while === |
− | + | إليك مثالًا بسيطًا يشرح استخدام حلقة <code>while</code>:<syntaxhighlight lang="bash"> | |
− | إليك مثالًا بسيطًا يشرح استخدام حلقة while:<syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
سطر 21: | سطر 21: | ||
while [ $i -lt 4 ] | while [ $i -lt 4 ] | ||
do | do | ||
− | xterm & | + | xterm & |
− | i=$[$i+1] | + | i=$[$i+1] |
done | done | ||
− | </syntaxhighlight> | + | </syntaxhighlight> |
− | كُتب المثال التالي | + | === حلقات while المتداخلة === |
+ | كُتب المثال التالي من أجل نسخ صور التقطت بواسطة كاميرا ويب إلى مجلد في خادم ويب، إذ تلتقط صورة كل خمس دقائق، وكل ساعة يُنشأ مجلد جديد يحمل صور تلك الساعة، كما يُنشأ مجلد كل يوم يحتوي على 24 مجلد فرعي. يعمل البرنامج في الخلفية:<syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
سطر 49: | سطر 50: | ||
done | done | ||
done | done | ||
− | </syntaxhighlight>لاحظ استخدام عبارة | + | </syntaxhighlight>لاحظ استخدام عبارة <code>true</code>، هذا يعني: تابع التنفيذ حتى تُقاطع العملية بالقوة، عن طريق أمر <code>kill</code> أو Ctrl+c. |
المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash"> | المثال التالي ينشئ ملفات، ويمكن أن يُستخدم لاختبارات المحاكاة:<syntaxhighlight lang="bash"> | ||
سطر 57: | سطر 58: | ||
while true; do | while true; do | ||
− | touch pic-`date +%s`.jpg | + | touch pic-`date +%s`.jpg |
− | 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 === | ||
يمكن تفسير البرنامج التالي بواسطة المستخدم عند إدخال ctrl+c:<syntaxhighlight lang="bash"> | يمكن تفسير البرنامج التالي بواسطة المستخدم عند إدخال ctrl+c:<syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
سطر 100: | سطر 96: | ||
done | done | ||
− | </syntaxhighlight>يُستخدم مستند here لعرض خيارات مختلفة على المستخدم ليختار | + | </syntaxhighlight>يُستخدم مستند here لعرض خيارات مختلفة على المستخدم ليختار منها -مستند here أو heredoc هو طريقة لتغذية برنامج للصدفة بمحتوي قصير بدون كتابته في ملف منفصل-، وكما ذكرنا قبل قليل فإن عبارة <code>true</code> تكرر الأوامر من قائمة الأوامر التابعة مرة بعد مرة. |
− | |||
− | |||
+ | === حساب المتوسط === | ||
يحسب هذا البرنامج متوسط مدخلات المستخدم والتي تُختبر قبل أن تُنفَّذ، فإن كان المُدخَل خارج النطاق فإن رسالة تُطبع بذلك، أما إن ضغط المستخدم على مفتاح q فإن الحلقة تخرج:<syntaxhighlight lang="bash"> | يحسب هذا البرنامج متوسط مدخلات المستخدم والتي تُختبر قبل أن تُنفَّذ، فإن كان المُدخَل خارج النطاق فإن رسالة تُطبع بذلك، أما إن ضغط المستخدم على مفتاح q فإن الحلقة تخرج:<syntaxhighlight lang="bash"> | ||
#!/bin/bash | #!/bin/bash | ||
سطر 134: | سطر 129: | ||
</syntaxhighlight>لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية. | </syntaxhighlight>لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية. | ||
− | انظر أيضًا | + | == انظر أيضًا == |
+ | * [[Bash/more advanced if usage|استخدامات if المتقدمة في Bash]]. | ||
+ | * [[Bash/writing interactive scripts|كتابة برامج Bash تفاعلية]]. | ||
+ | * [[Bash/for loop|حلقة for في Bash]]. | ||
− | مصادر | + | == مصادر == |
+ | * [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_02.html دليل Bash للمبتدئين، صفحة حلقة while في Bash]. | ||
+ | [[تصنيف:Bash]] | ||
+ | [[تصنيف: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."
لاحظ كيف تُركت المتغيرات في الأسطر الأخيرة بدون علامات تنصيص من أجل العمليات الحسابية.