Библиотека сайта rus-linux.net
Руководство по 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 |