Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 7: Условные инструкции Вперед

Использование инструкций case

Проверка простых условий

То, что можно использовать вложенные инструкции if, возможно, замечательно, но, как только различных допустимых действий станет несколько, с ними можно запутаться. В более сложных условиях используйте инструкцию case со следующим синтаксисом:

case EXPRESSION in CASE1) COMMAND-LIST;; CASE2) COMMAND-LIST;; ... CASEN) COMMAND-LIST;; esac 

Каждый вариант CASE является выражением, соответствующим некоторому шаблону. После того, как будет обнаружено первое совпадение, будут выполнены команды, находящиеся в списке COMMAND-LIST. Символ "|" используется для разделения нескольких шаблонов, а оператор ")" завершает список шаблонов. Каждый вариант CASE плюс соответствующие команды называются предложением. Каждое предложение должно завершаться символами ";;". Каждая инструкция case завершается инструкцией ESAC.

В этом примере мы продемонстрируем, как в скрипте disktest.sh варианты case используются для отправки конкретного предупреждающего сообщения:

anny ~/testdir> cat disktest.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`" anny

anny ~/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>

Вам, конечно, следует открыть вашу почтовую программу и проверить результат; здесь всего лишь продемонстрировано, как скрипт посылает почту с правильно заполненными строками заголовка "To:" ("Кому:"), "Subject:" ("Тема:") и "From:" ("От:").

Еще больше примеров использования инструкции case можно найти в директории, в котором в вашей системе хранятся скрипты init. В этих скриптах варианты start и stop используются для запуска или остановки системных процессов. Пример такого скрипта можно найти в следующем разделе.

Пример скрипта init

В скриптах начального запуска 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 "Функции".


Предыдущий раздел: Оглавление Следующий раздел:
Конструкции if/then/elif/else   Подводим итоги главы 7