الفرق بين المراجعتين ل"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 لمزيد من الشرح.

انظر أيضًا

مصادر