الفرق بين المراجعتين لصفحة: «Bash/using case statements»
أسامه-دمراني (نقاش | مساهمات) إدخال 1.0، عنوان الصفحة |
أسامه-دمراني (نقاش | مساهمات) إدخال 2.0 إضافة محتوى وتنسيقه والتصنيفات. |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:استخدام عبارات case}}</noinclude> | <noinclude>{{DISPLAYTITLE:استخدام عبارات case}}</noinclude> | ||
== الحالات المُبسطة == | |||
قد يكون من السهل اللجوء إلى استخدام عبارات <code>if</code> لبداهة أسلوبها، لكن تلك السهولة تنقلب إلى حيرة حين تواجه بضعة اختيارات مختلفة لإجراءات محتملة يجب اتخاذها، ولمثل تلك الحالات نستخدم عبارة <code>case</code>، وبنيتها اللغوية هي كما يلي:<syntaxhighlight lang="bash"> | |||
case EXPRESSION in CASE1) COMMAND-LIST;; CASE2) COMMAND-LIST;; ... CASEN) COMMAND-LIST;; esac | |||
</syntaxhighlight>وتطابق كل حالة في التعبير السابق نمطًا (pattern)، وتُنفَّذ الأوامر التي في قائمة <code>COMMAND-LIST</code> لأول تطابق، ويُستخدم محرف الأنبوب <code>|</code> لفصل الأنماط المتعددة، وينهي معامِل <code>(</code> قائمة الأنماط، ويُطلق اسم البند (clause) على كل حالة (case) والأوامر التابعة لها، ويجب أن ينتهي كل بند بفاصلتين منقوطتين <code>;;</code>، كما تنتهي أي عبارة <code>case</code> بعبارة <code>esac</code>. | |||
انظر المثال التالي الذي يشرح استخدام عبارات <code>case</code> لإرسال رسائل تحذير أكثر تنوعًا ببرنامج <code>disktest.sh</code>:<syntaxhighlight lang="bash"> | |||
hsoub ~/testdir> cat disktest.sh | |||
#!/bin/bash | |||
# يُجري هذا البرنامج اختبارًا بسيطًا لمساحة القرص الصلب. | |||
space=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` | |||
case $space in | |||
[1-6]*) | |||
Message="All is quiet." | |||
;; | |||
[7-8]*) | |||
Message="Start thinking about cleaning out some stuff. There's a partition that is $space % full." | |||
;; | |||
9[1-8]) | |||
Message="Better hurry with that new disk... One partition is $space % full." | |||
;; | |||
99) | |||
Message="I'm drowning here! There's a partition at $space %!" | |||
;; | |||
*) | |||
Message="I seem to be running with an nonexistent amount of disk space..." | |||
;; | |||
esac | |||
echo $Message | mail -s "disk report `date`" hsoub | |||
hsoub ~/testdir> | |||
You have new mail. | |||
hsoub ~/testdir> tail -16 /var/spool/mail/hsoub | |||
From hsoub@alaraby Tue Jan 14 22:10:47 2003 | |||
Return-Path: <hsoub@alaraby> | |||
Received: from alaraby (localhost [127.0.0.1]) | |||
by alaraby (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414 | |||
for <hsoub@alaraby>; Tue, 14 Jan 2003 22:10:47 +0100 | |||
Received: (from hsoub@localhost) | |||
by alaraby (8.12.5/8.12.5/Submit) id h0ELAltn020413 | |||
for hsoub; Tue, 14 Jan 2003 22:10:47 +0100 | |||
Date: Tue, 14 Jan 2003 22:10:47 +0100 | |||
From: Hsoub <hsoub@alaraby> | |||
Message-Id: <200301142110.h0ELAltn020413@alaraby> | |||
To: hsoub@alaraby | |||
Subject: disk report Tue Jan 14 22:10:47 CET 2003 | |||
Start thinking about cleaning out some stuff. There's a partition that is 87 % full. | |||
hsoub ~/testdir> | |||
</syntaxhighlight>كان بإمكانك فتح برنامج البريد الذي تستخدمه لتفقد النتائج، لكن هذا المثال كان لبيان أن البرنامج يرسل رسائل بريدية كاملة شاملة المرسل إليه <code>To</code> وعنوان الرسالة <code>Subject</code> والمُرسِل <code>From</code>. تستطيع إيجاد أمثلة كثيرة لاستخدام عبارات <code>case</code> في مجلد شيفرات init لديك، إذ تستخدم برامج بدء التشغيل (startup scripts) عبارات <code>start</code> و <code>stop</code> لتشغيل أو إيقاف عمليات النظام، ستجد مثالًا نظريًا أدناه. | |||
== مثال initscript == | |||
تستخدم شيفرات init عبارة <code>case</code> من أجل بدء وإيقاف خدمات النظام وكذلك من أجل لاستعلام عنها، وفي المثال التالي جزءٌ من برنامج يبدأ خدمة <code>Anacron</code>، وهو عفريت (daemon) يُنفِّذ أوامرَ بشكل دوري على فترات تُحدد بالأيام.<syntaxhighlight lang="bash"> | |||
case "$1" in | |||
start) | |||
start | |||
;; | |||
stop) | |||
stop | |||
;; | |||
status) | |||
status anacron | |||
;; | |||
restart) | |||
stop | |||
start | |||
;; | |||
condrestart) | |||
if test "x`pidof anacron`" != x; then | |||
stop | |||
start | |||
fi | |||
;; | |||
*) | |||
echo $"Usage: $0 {start|stop|restart|condrestart|status}" | |||
exit 1 | |||
esac | |||
</syntaxhighlight>تُحدد المهام التي يجب تنفيذها -مثل تشغيل وإيقاف العفريت- داخل دوال يكون مصدرها، بشكل جزئي، هو ملف <code>etc/rc.d/init.d/functions/</code>، انظر فصل [[Bash/functions|الدوال في Bash]] لمزيد من الشرح. | |||
== انظر أيضًا == | |||
* [[Bash/for loop|حلقة for في Bash.]] | |||
* [[Bash/while loop|حلقة while في Bash]]. | |||
* [[Bash/until loop|حلقة until في Bash]]. | |||
== مصادر == | |||
* <span> </span>[http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html دليل Bash للمبتدئين، باب البُنى الشرطية في Bash، فصل استخدام البنية case في Bash]. | |||
[[تصنيف:Bash]] | |||
[[تصنيف:Bash Case Statement]] |
مراجعة 22:28، 29 أغسطس 2018
الحالات المُبسطة
قد يكون من السهل اللجوء إلى استخدام عبارات if
لبداهة أسلوبها، لكن تلك السهولة تنقلب إلى حيرة حين تواجه بضعة اختيارات مختلفة لإجراءات محتملة يجب اتخاذها، ولمثل تلك الحالات نستخدم عبارة case
، وبنيتها اللغوية هي كما يلي:
case EXPRESSION in CASE1) COMMAND-LIST;; CASE2) COMMAND-LIST;; ... CASEN) COMMAND-LIST;; esac
وتطابق كل حالة في التعبير السابق نمطًا (pattern)، وتُنفَّذ الأوامر التي في قائمة COMMAND-LIST
لأول تطابق، ويُستخدم محرف الأنبوب |
لفصل الأنماط المتعددة، وينهي معامِل (
قائمة الأنماط، ويُطلق اسم البند (clause) على كل حالة (case) والأوامر التابعة لها، ويجب أن ينتهي كل بند بفاصلتين منقوطتين ;;
، كما تنتهي أي عبارة case
بعبارة esac
.
انظر المثال التالي الذي يشرح استخدام عبارات case
لإرسال رسائل تحذير أكثر تنوعًا ببرنامج disktest.sh
:
hsoub ~/testdir> cat disktest.sh
#!/bin/bash
# يُجري هذا البرنامج اختبارًا بسيطًا لمساحة القرص الصلب.
space=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -`
case $space in
[1-6]*)
Message="All is quiet."
;;
[7-8]*)
Message="Start thinking about cleaning out some stuff. There's a partition that is $space % full."
;;
9[1-8])
Message="Better hurry with that new disk... One partition is $space % full."
;;
99)
Message="I'm drowning here! There's a partition at $space %!"
;;
*)
Message="I seem to be running with an nonexistent amount of disk space..."
;;
esac
echo $Message | mail -s "disk report `date`" hsoub
hsoub ~/testdir>
You have new mail.
hsoub ~/testdir> tail -16 /var/spool/mail/hsoub
From hsoub@alaraby Tue Jan 14 22:10:47 2003
Return-Path: <hsoub@alaraby>
Received: from alaraby (localhost [127.0.0.1])
by alaraby (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414
for <hsoub@alaraby>; Tue, 14 Jan 2003 22:10:47 +0100
Received: (from hsoub@localhost)
by alaraby (8.12.5/8.12.5/Submit) id h0ELAltn020413
for hsoub; Tue, 14 Jan 2003 22:10:47 +0100
Date: Tue, 14 Jan 2003 22:10:47 +0100
From: Hsoub <hsoub@alaraby>
Message-Id: <200301142110.h0ELAltn020413@alaraby>
To: hsoub@alaraby
Subject: disk report Tue Jan 14 22:10:47 CET 2003
Start thinking about cleaning out some stuff. There's a partition that is 87 % full.
hsoub ~/testdir>
كان بإمكانك فتح برنامج البريد الذي تستخدمه لتفقد النتائج، لكن هذا المثال كان لبيان أن البرنامج يرسل رسائل بريدية كاملة شاملة المرسل إليه To
وعنوان الرسالة Subject
والمُرسِل From
. تستطيع إيجاد أمثلة كثيرة لاستخدام عبارات case
في مجلد شيفرات init لديك، إذ تستخدم برامج بدء التشغيل (startup scripts) عبارات start
و stop
لتشغيل أو إيقاف عمليات النظام، ستجد مثالًا نظريًا أدناه.
مثال initscript
تستخدم شيفرات init عبارة case
من أجل بدء وإيقاف خدمات النظام وكذلك من أجل لاستعلام عنها، وفي المثال التالي جزءٌ من برنامج يبدأ خدمة Anacron
، وهو عفريت (daemon) يُنفِّذ أوامرَ بشكل دوري على فترات تُحدد بالأيام.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status anacron
;;
restart)
stop
start
;;
condrestart)
if test "x`pidof anacron`" != x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
تُحدد المهام التي يجب تنفيذها -مثل تشغيل وإيقاف العفريت- داخل دوال يكون مصدرها، بشكل جزئي، هو ملف etc/rc.d/init.d/functions/
، انظر فصل الدوال في Bash لمزيد من الشرح.