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








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

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

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

Конструкции if/then/elif/else

Общие положения

Это полная форма инструкции if:

if TEST-COMMANDS; then 
CONSEQUENT-COMMANDS; 
elif MORE-TEST-COMMANDS; then 
MORE-CONSEQUENT-COMMANDS; 
else ALTERNATE-CONSEQUENT-COMMANDS; 
fi 

Выполняется список команд TEST-COMMANDS и, если вернется нулевой код возврата, будет выполняться список CONSEQUENT-COMMANDS. Если TEST-COMMANDS возвращает ненулевой код возврата, то будет поочередно выполняться каждый elif (то есть список MORE-TEST-COMMANDS), и если его код возврата равен нулю, будет выполнен соответствующий список MORE-CONSEQUENT-COMMANDS и выполнение команды будет завершено. Если за else следует список ALTERNATE-CONSEQUENT-COMMANDS и последняя команда в списке if или elif возвратит ненулевой код, будет выполняться список ALTERNATE-CONSEQUENT-COMMANDS. Кодом возврата будет код возврата последней выполненной команды, либо ноль, если нет условия, проверяемого на значение истина.

Пример

Приведенный ниже пример вы можете добавить в таблицу crontab для ежедневного его исполнения:

anny /etc/cron.daily> 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 -`
alertvalue="80"

if [ "$space" -ge "$alertvalue" ]; then
  echo "At least one of my disks is nearly full!" | mail -s "daily diskcheck" root
else
  echo "Disk space normal" | mail -s "daily diskcheck" root
fi

Вложенные инструкции if

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

В этом примере проверяются високосные годы:

anny ~/testdir> cat testleap.sh
#!/bin/bash
# This script will test if we're in a leap year or not.

year=`date +%Y`

if [ $[$year % 400] -eq "0" ]; then
  echo "This is a leap year.  February has 29 days."
elif [ $[$year % 4] -eq 0 ]; then
        if [ $[$year % 100] -ne 0 ]; then
          echo "This is a leap year, February has 29 days."
        else
          echo "This is not a leap year.  February has 28 days."
        fi
else
  echo "This is not a leap year.  February has 28 days."
fi

anny ~/testdir> date
Tue Jan 14 20:37:55 CET 2003

anny ~/testdir> testleap.sh
This is not a leap year.

Логические операции

Вы можете сократить размер приведенного выше скрипта, если воспользуетесь логическими операторами "AND" (&&) и "OR" (||).

Рис. 7.2. Пример использования логических операторов

При проверке арифметических выражений мы пользуемся двойными квадратными скобками; смотрите раздел "Арифметические выражения", описывающий подстановки арифметических выражений. Это эквивалентно использованию инструкции let. Если здесь пользоваться квадратными скобками, то ничего не получится, если вы, например, попытаетесь указать что-нибудь, похожее на $[$year % 400], т. к. здесь квадратные скобки сами по себе командами фактически не являются.

Среди других редакторов, gvim является одним из тех, в которых в соответствие с форматом файла выбираются различные цветовые схемы; такие редакторы полезны для выявления ошибок в коде.

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

В разделе "Проверка количества аргументов" мы уже кратко познакомились с инструкцией exit. Она завершает выполнение всего скрипта. Чаще всего она используется в случае, если пользователь ввел неправильные данные, если при работе инструкции возникли проблемы или если возникла какая-либо другая ошибка.

В инструкции exit есть один необязательный аргумент. Этот аргумент является целым числом, представляющим код возврата, которые возвращается в родительский процесс и запоминается в переменной $?.

Если аргумент нулевой, то это означает, что скрипт проработал успешно. Любое другое значение программисты могут использовать для возврата в родительский процесс различных сообщений с тем, чтобы в соответствие с неудачным или успешным завершением дочернего процесса выполнять различные действия. Если в команде exit аргумент не задан, родительская оболочка будет использовать текущее значение переменной $?.

Ниже приведен пример слегка адаптированного скрипта penguin.sh, который отправляет код возврата обратно в родительскую оболочку feed.sh:

anny ~/testdir> cat penguin.sh
#!/bin/bash
                                                                                                 
# This script lets you present different menus to Tux.  He will only be happy
# when given a fish.  We've also added a dolphin and (presumably) a camel.
                                                                                                 
if [ "$menu" == "fish" ]; then
  if [ "$animal" == "penguin" ]; then
    echo "Hmmmmmm fish... Tux happy!"
  elif [ "$animal" == "dolphin" ]; then
    echo "Pweetpeettreetppeterdepweet!"
  else
    echo "*prrrrrrrt*"
  fi
else
  if [ "$animal" == "penguin" ]; then
    echo "Tux don't like that.  Tux wants fish!"
    exit 1
  elif [ "$animal" == "dolphin" ]; then
    echo "Pweepwishpeeterdepweet!"
    exit 2
  else
    echo "Will you read this sign?!"
    exit 3
  fi
fi

Приведенный выше скрипт вызывается из следующего скрипта, который для этого экспортирует свои переменные menu и animal:

anny ~/testdir> cat feed.sh
#!/bin/bash
# This script acts upon the exit status given by penguin.sh
                                                                                                 
export menu="$1"
export animal="$2"
                                                                                                 
feed="/nethome/anny/testdir/penguin.sh"
                                                                                                 
$feed $menu $animal
                                                                                                 
case $? in
                                                                                                 
1)
  echo "Guard: You'd better give'm a fish, less they get violent..."
  ;;
2)
  echo "Guard: It's because of people like you that they are leaving earth all the time..."
  ;;
3)
  echo "Guard: Buy the food that the Zoo provides for the animals, you ***, how
do you think we survive?"
  ;;
*)
  echo "Guard: Don't forget the guide!"
  ;;
esac
                                                                                                 
anny ~/testdir> ./feed.sh apple penguin
Tux don't like that.  Tux wants fish!
Guard: You'd better give'm a fish, less they get violent...

Как вы видите, можно выбрать любой код возврата. В существующих командах обычно используется ряд определенных кодов; дополнительную информацию смотрите в руководстве программиста по каждой команде.


Предыдущий раздел: Оглавление Следующий раздел:
Расширенные варианты использования конструкции if   Использование инструкций case