الفرق بين المراجعتين لصفحة: «Bash/break and continue»
أسامه-دمراني (نقاش | مساهمات) إدخال 3.0 إضافة التصنيفات |
أسامه-دمراني (نقاش | مساهمات) مراجعة 6: إضافة تصانيف وتعديل اسم مستخدم الطرفية |
||
(3 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 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|حلقة | يوضح المثال التالي حلقة <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 | [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 | [wiki@hsoub ~/test] rm * | ||
[hsoub | [wiki@hsoub ~/test] touch test Test TEST | ||
[hsoub | [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 | [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]. | ||
[[تصنيف:Bash]] | [[تصنيف:Bash]] | ||
[[تصنيف:Bash Break Statement]] | [[تصنيف:Bash Break Statement]] | ||
[[تصنيف:Bash Continue 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
، ويمكنه إجراء جميع أنواع التحويلات على الملفات.