الفرق بين المراجعتين لصفحة: «Bash/break and continue»

من موسوعة حسوب
إدخال 2.0 محتوى المادة
مراجعة 6: إضافة تصانيف وتعديل اسم مستخدم الطرفية
 
(4 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الأمران Break و Continue}}</noinclude>
<noinclude>{{DISPLAYTITLE:الأمران Break و Continue}}</noinclude>
== أمر Break ==
== أمر Break ==
تُستخدم عبارة <code>Break</code> للخروج من الحلقة التكرارية الحالية قبل موعد خروجها الأصلي، ويحدث هذا في الحالات التي لا تعرف فيها عدد المرات التي يجب أن تنفذها الحلقة، كأن تعتمد على إدخال المستخدم مثلًا.
تُستخدم عبارة <code>Break</code> للخروج من الحلقة التكرارية الحالية قبل موعد خروجها الأصلي، ويحدث هذا في الحالات التي لا تعرف فيها عدد المرات التي يجب أن تنفذها الحلقة، كأن تعتمد على إدخال المستخدم مثلًا.


يوضح المثال التالي حلقة <code>while</code> يمكن مقاطعتها، وهو مثال مُطوَّر من برنامج <code>wisdom.sh</code> من المثال المشروح في [[Bash/while loop|حلقة While في Bash]]:<syntaxhighlight lang="bash">
يوضح المثال التالي حلقة <code>while</code> يمكن مقاطعتها، وهو مثال مُطوَّر من برنامج <code>wisdom.sh</code> من المثال المشروح في [[Bash/while loop#.D8.A7.D8.B3.D8.AA.D8.AE.D8.AF.D8.A7.D9.85 .D9.85.D9.8F.D8.AF.D8.AE.D9.84.D8.A7.D8.AA .D9.84.D9.88.D8.AD.D8.A9 .D8.A7.D9.84.D9.85.D9.81.D8.A7.D8.AA.D9.8A.D8.AD .D9.84.D9.84.D8.AA.D8.AD.D9.83.D9.85 .D9.81.D9.8A .D8.AD|استخدام مُدخلات لوحة المفاتيح للتحكم في حلقة while]] :<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash


سطر 81: سطر 80:


لا تأخذ هذه الأوامر كثيرًا من موارد النظام، ورغم أن مثل تلك المشاكل يمكن حلها باستخدام أمريْ <code>sed</code> و <code>awk</code> على الأرجح، لكن على أي حال من المفيد معرفة هذا الأسلوب في الحل إذ يكون مفيدًا عند تنفيذ مهام كبيرة، ولن يكون ذلك ضروريًا إن أُدخلت الاختبارات في المواضع الصحيحة داخل البرنامج موفِّرةً موارد النظام:<syntaxhighlight lang="bash">
لا تأخذ هذه الأوامر كثيرًا من موارد النظام، ورغم أن مثل تلك المشاكل يمكن حلها باستخدام أمريْ <code>sed</code> و <code>awk</code> على الأرجح، لكن على أي حال من المفيد معرفة هذا الأسلوب في الحل إذ يكون مفيدًا عند تنفيذ مهام كبيرة، ولن يكون ذلك ضروريًا إن أُدخلت الاختبارات في المواضع الصحيحة داخل البرنامج موفِّرةً موارد النظام:<syntaxhighlight lang="bash">
[hsoub@alaraby ~/test] cat tolower.sh
[wiki@hsoub ~/test] cat tolower.sh
#!/bin/bash
#!/bin/bash


سطر 101: سطر 100:
done
done
</syntaxhighlight>هذا البرنامج لديه نقطة ضعف واحدة على الأقل، وهي أنه يستبدل الملفات الحالية، ولا يكون أمر <code>noclobber</code> مفيدًا إلا عند حدوث إعادة توجيه. كذلك فإن خيار <code>b-</code> لأمر <code>mv</code> يوفر أمانًا أكثر، لكن ذلك الأمان لا يفيد إلا في حالة استبدال غير مقصود، كما ترى في المثال التالي:<syntaxhighlight lang="bash">
</syntaxhighlight>هذا البرنامج لديه نقطة ضعف واحدة على الأقل، وهي أنه يستبدل الملفات الحالية، ولا يكون أمر <code>noclobber</code> مفيدًا إلا عند حدوث إعادة توجيه. كذلك فإن خيار <code>b-</code> لأمر <code>mv</code> يوفر أمانًا أكثر، لكن ذلك الأمان لا يفيد إلا في حالة استبدال غير مقصود، كما ترى في المثال التالي:<syntaxhighlight lang="bash">
[hsoub@alaraby ~/test] rm *
[wiki@hsoub ~/test] rm *


[hsoub@alaraby ~/test] touch test Test TEST
[wiki@hsoub ~/test] touch test Test TEST


[hsoub@alaraby ~/test] bash -x tolower.sh
[wiki@hsoub ~/test] bash -x tolower.sh
++ ls
++ ls
+ LIST=test
+ LIST=test
سطر 129: سطر 128:
new name for TEST is test
new name for TEST is test


[hsoub@alaraby ~/test] ls -a
[wiki@hsoub ~/test] ls -a
./  ../  test  test~
./  ../  test  test~
</syntaxhighlight>يأتي أمر <code>tr</code> كجزء من حزمة <code>textutils</code>، ويمكنه إجراء جميع أنواع التحويلات على الملفات.
</syntaxhighlight>يأتي أمر <code>tr</code> كجزء من حزمة <code>textutils</code>، ويمكنه إجراء جميع أنواع التحويلات على الملفات.
سطر 138: سطر 137:


== مصادر ==
== مصادر ==
<span> </span>
* <span> </span>[http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_05.html دليل Bash للمبتدئين، صفحة عبارتيْ Break و Continue].
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_05.html دليل Bash للمبتدئين، الباب التاسع "المهام التكرارية"، الفصل الخامس "عبارتيْ Break و Continue"].
[[تصنيف:Bash]]
[[تصنيف:Bash Break Statement]]
[[تصنيف:Bash Continue Statement]]
[[تصنيف:Bash Loops]]
[[تصنيف:Bash While Loop]]
[[تصنيف:Bash Echo Command]]
[[تصنيف:Bash For Loop]]
[[تصنيف:Bash Until Loop]]

المراجعة الحالية بتاريخ 00:39، 7 سبتمبر 2018

أمر Break

تُستخدم عبارة Break للخروج من الحلقة التكرارية الحالية قبل موعد خروجها الأصلي، ويحدث هذا في الحالات التي لا تعرف فيها عدد المرات التي يجب أن تنفذها الحلقة، كأن تعتمد على إدخال المستخدم مثلًا.

يوضح المثال التالي حلقة while يمكن مقاطعتها، وهو مثال مُطوَّر من برنامج wisdom.sh من المثال المشروح في استخدام مُدخلات لوحة المفاتيح للتحكم في حلقة while :

#!/bin/bash

# هذا البرنامج يطبع أمثالًا ونصائح
# يمكنك الخروج الآن بطريقة أفضل.

FORTUNE=/usr/games/fortune

while true; do
echo "On which topic do you want advice?"
echo "1.  politics"
echo "2.  startrek"
echo "3.  kernelnewbies"
echo "4.  sports"
echo "5.  bofh-excuses"
echo "6.  magic"
echo "7.  love"
echo "8.  literature"
echo "9.  drugs"
echo "10. education"
echo

echo -n "Enter your choice, or 0 for exit: "
read choice
echo

case $choice in
     1)
     $FORTUNE politics
     ;;
     2)
     $FORTUNE startrek
     ;;
     3)
     $FORTUNE kernelnewbies
     ;;
     4)
     echo "Sports are a waste of time, energy and money."
     echo "Go back to your keyboard."
     echo -e "\t\t\t\t -- \"Unhealthy is my middle name\" Soggie."
     ;;
     5)
     $FORTUNE bofh-excuses
     ;;
     6)
     $FORTUNE magic
     ;;
     7)
     $FORTUNE love
     ;;
     8)
     $FORTUNE literature
     ;;
     9)
     $FORTUNE drugs
     ;;
     10)
     $FORTUNE education
     ;;
     0)
     echo "OK, see you!"
     break
     ;;
     *)
     echo "That is not a valid choice, try a number from 0 to 10."
     ;;
esac  
done

لاحظ أمر break الذي يُنهي الحلَقة فقط -وليس البرنامج-. يمكن رؤية هذا بوضوح عن طريق إضافة أمر echo في نهاية البرنامج، وسيُنفَّذ أمر echo أيضًا عند كتابة مُدخَل يسبب تنفيذ أمر break (حين يكتب المستخدم "0"). كذلك فإن أمر break يسمح -في حالة الحلقات المتداخلة- بتحديد أي الحلقات التي تخرج، انظر صفحات دليل info للمزيد.

أمر Continue

تعيد عبارة continue تكرار حلقة for أو while أو until أو select المُرفقة، وحين تُستخدم في حلقة for فإن المتغير الحاكم -controlling variable- يأخذ قيمة العنصر التالي في القائمة. أما في حالة استخدامها في حلقة while أو until فإن التنفيذ يعود مرة أخرى مع وضع أمر الاختبار TEST-COMMAND في أول الحلقة.

أمثلة

في المثال التالي تُحوَّل حالة أحرف أسماء الملفات إلى الحالة الصغرى، وتعيد عبارة continue تنفيذ الحلقة إن لم تكن ثمة حروف تحتاج إلى تحويل حالتها.

لا تأخذ هذه الأوامر كثيرًا من موارد النظام، ورغم أن مثل تلك المشاكل يمكن حلها باستخدام أمريْ sed و awk على الأرجح، لكن على أي حال من المفيد معرفة هذا الأسلوب في الحل إذ يكون مفيدًا عند تنفيذ مهام كبيرة، ولن يكون ذلك ضروريًا إن أُدخلت الاختبارات في المواضع الصحيحة داخل البرنامج موفِّرةً موارد النظام:

[wiki@hsoub ~/test] cat tolower.sh
#!/bin/bash

# يحوِّل هذا البرنامج كل أسماء الملفات التي تحتوي حروفًا كبيرة إلى أسماء بحروف صغيرة.

LIST="$(ls)"

for name in "$LIST"; do

if [[ "$name" != *[[:upper:]]* ]]; then
continue
fi

ORIG="$name"
NEW=`echo $name | tr 'A-Z' 'a-z'`

mv "$ORIG" "$NEW"
echo "new name for $ORIG is $NEW"
done

هذا البرنامج لديه نقطة ضعف واحدة على الأقل، وهي أنه يستبدل الملفات الحالية، ولا يكون أمر noclobber مفيدًا إلا عند حدوث إعادة توجيه. كذلك فإن خيار b- لأمر mv يوفر أمانًا أكثر، لكن ذلك الأمان لا يفيد إلا في حالة استبدال غير مقصود، كما ترى في المثال التالي:

[wiki@hsoub ~/test] rm *

[wiki@hsoub ~/test] touch test Test TEST

[wiki@hsoub ~/test] bash -x tolower.sh
++ ls
+ LIST=test
Test
TEST
+ [[ test != *[[:upper:]]* ]]
+ continue
+ [[ Test != *[[:upper:]]* ]]
+ ORIG=Test
++ echo Test
++ tr A-Z a-z
+ NEW=test
+ mv -b Test test
+ echo 'new name for Test is test'
new name for Test is test
+ [[ TEST != *[[:upper:]]* ]]
+ ORIG=TEST
++ echo TEST
++ tr A-Z a-z
+ NEW=test
+ mv -b TEST test
+ echo 'new name for TEST is test'
new name for TEST is test

[wiki@hsoub ~/test] ls -a
./  ../  test  test~

يأتي أمر tr كجزء من حزمة textutils، ويمكنه إجراء جميع أنواع التحويلات على الملفات.

انظر أيضًا

مصادر