دستورات if تو در تو ممکن است زیبا باشند، اما به محض اینکه با گروهی از عملیات محتمل برای اجرا مواجه گردید، آنها متمایل به اغتشاش میشوند. برای شرایط پیچیدهتر، از ترکیب case استفاده کنید:
case
EXPRESSION
in CASE1
) COMMAND-LIST;; CASE2
) COMMAND-LIST;; ... CASEN
) COMMAND-LIST;; esac
هر case یک عبارت منطبق بر یک الگو میباشد. دستورات در COMMAND-LIST برای اولین مورد انطباق اجرا میشوند. علامت “|” برای جدا نمودن الگوهای چندگانه به کار میرود، و عملگر “)” یک لیست الگو را خاتمه میدهد. هر case بهاضافه دستورات مربوطهاش یک قضیهنامیده میشود. هر قضیه باید با “;;” خاتمه یابد. هر فرمانcase با جمله esac به پایان میرسد.
در مثال، استفاده از caseها را برایارسال پیغامهای هشدار انتخابیتر در اسکریپت disktest.sh
به کار بردهایم:
anny ~/testdir>
catdisktest.sh
#!/bin/bash # This script does a very simple test for checking disk space. 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`" annyanny ~/testdir>
You have new mail.anny ~/testdir>
tail-16
/var/spool/mail/anny
From anny@octarine Tue Jan 14 22:10:47 2003 Return-Path: <anny@octarine> Received: from octarine (localhost [127.0.0.1]) by octarine (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414 for <anny@octarine>; Tue, 14 Jan 2003 22:10:47 +0100 Received: (from anny@localhost) by octarine (8.12.5/8.12.5/Submit) id h0ELAltn020413 for anny; Tue, 14 Jan 2003 22:10:47 +0100 Date: Tue, 14 Jan 2003 22:10:47 +0100 From: Anny <anny@octarine> Message-Id: <200301142110.h0ELAltn020413@octarine> To: anny@octarine 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.anny ~/testdir>
البته میتوانستید برنامه mail خودتان را برای کنترل نتایج باز کنید، این فقط برای نمایش دادن آن است که اسکریپت یک پیغام آراسته با سطرهای سرآیند “To:”, “Subject:” , “From:” ارسال میکند.
مثالهای بسیار دیگری از کاربرد دستورات case میتوانید در دایرکتوری اسکریپتهای init سیستم خود میتوانید پیدا کنید. اسکریپتهای شروع آغازین از caseهای start و stop برای اجرا یا توقف پردازشها استفاده میکنند. یک مثال نظری را در بخش بعد میتوان یافت.
اسکریپتهای Init اغلب از دستورات case برای شروع، توقف و پرس و جوی سرویسهای سیستمی استفاده میکنند. این یک گزیدهای از اسکریپت شروع کننده Anacron است، یک برنامه کمکی که دستورات را به طور متناوب با دوره تناوب تعیین شده بر حسب روز اجرا میکند.
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
وظایف اجرایی در هر case، از قبیل توقف و شروع برنامه کمکی، به طور جزء به جزء در توابعی تعریف شدهاند، که منبع آنها این فایل میباشد.
/etc/rc.d/init.d/functions
برای اطلاعات بیشتر فصل 11، توابع را ملاحظه کنید.