استخدام البُنية case

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

حالات مُبسطة

قد يكون من السهل اللجوء إلى استخدام عبارات 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 لمزيد من الشرح.

انظر أيضًا

مصادر