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

UnixForum





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

Разработка сценариев командной оболочки для начинающих. Часть 4: Условия и условные инструкции If-Then

Оригинал: The Beginner’s Guide to Shell Scripting 4: Conditions & If-Then Statements
Автор: Yatri Trivedi
Дата публикации: 18 августа 2011 г.
Перевод: А.Панин
Дата перевода: 22 октября 2016 г.

Разработка сценариев командной оболочки для начинающих. Часть 4: Условия и условные инструкции If-Then

В рамках нашей серии статей (см. 1, 2, 3) мы уже рассмотрели достаточное количество синтаксических конструкций сценариев командной оболочки для выполнения различных экспериментов. В сегодняшней статье мы рассмотрим еще одну конструкцию, а именно, условную инструкцию if-then.

Что такое условия?

В обычной жизни под условиями понимаются требования, после выполнения которых будут выполняться те или иные действия. Например, чтобы подключить мой ноутбук к сети Интернет, следует выполнить несколько условий, а именно, выбрать Интернет-провайдера, приобрести модем или маршрутизатор, включить ноутбук и так далее… Это очень простые условия и в том случае, если одно из них не будет выполнено, действие, заключающееся в подключении моего ноутбука к сети Интернет, также не будет выполнено.

В мире компьютеров условные инструкции работают похожим образом. Мы можем проверить, совпадает или не совпадает одна строка с другой строкой, либо вообще проверить ее существование. Аналогично мы можем сравнить числовые аргументы для того, чтобы установить, является ли значение первого большим, меньшим или равным значению второго. Для того, чтобы выполнить какое-либо действие в том случае, если условие будет выполнено, мы можем использовать условную инструкцию "if-then". Формат этой инструкции достаточно прост:

if УСЛОВИЕ
then
команда1
команда2
...
командаn
fi

Условные инструкции

Давайте протестируем небольшой простой сценарий следующего содержания:

if test $1 -gt $2
then
echo "$1 больше, чем $2"
fi

Результат исполнения сценария

Вы наверняка обратите внимание на тот факт, что команда для вывода строки будет исполняться лишь тогда, когда условие будет выполняться. В противном случае сценарий будет завершать свою работу сразу же после сравнения числовых значений в рамках условной инструкции "if". В том случае, если после условной инструкции "if" будут расположены какие-либо команды, они будут исполняться как обычно. Я добавил следующую строку в конец приведенного выше кода сценария для иллюстрации этого утверждения:

echo "Команда после условной инструкции if"

Исполнение команд после условной инструкции

А это некоторые флаги команды "test" для сравнения числовых значений, которые могут понадобиться вам:

  • -eq: равно
  • -ne: не равно
  • -lt: меньше
  • -le: меньше или равно
  • -gt: больше
  • -ge: больше или равно

Сравнение строк

Теперь, если мы модифицируем первую строку кода нашего сценария следующим образом:

if test $1 = $2

данная условная инструкция будет осуществлять сравнение двух строк. При этом следует учитывать важную особенность данной операции! При использовании знака "равно" ("=") осуществляется сравнение двух строк, а не числовых значений. Если вам нужно сравнить два числовых значения, вам придется использовать флаг "-eq" команды "test" по аналогии с тем, как мы использовали флаг "-gt" выше.

Сравнение строк

Теперь давайте выполним еще одну модификацию:

if test $1 != $2
Неравенство строк

Добавление восклицательного знака ("!") эквивалентно приставке "не". Исходя из этого, следующая после условной инструкции команда будет исполняться лишь в том случае, если две строки не являются идентичными.

А это список некоторых флагов команды сравнения строк, которые могут понадобиться вам:

  • строка: использование аргумента без каких-либо флагов позволяет проверить, является ли строка не пустой (null) или вообще не объявленной каким-либо образом
  • -n строка: аргумент с данным флагом позволяет проверить, является ли строка не пустой и объявлена ли она
  • -z строка: аргумент с данным флагом позволяет проверить, является ли строка пустой и объявлена ли она

Что еще можно сказать насчет условной инструкции?

Я признаю, что оригинальное название данного раздела ("What Else About If?") является всего лишь плохой игрой слов. Мы уже знаем, как выполнять команду, если заданное условие выполняется, но что делать в том случае, если нам понадобится выполнить другую команду в том случае, если условие не будет выполнено? В этом случае мы можем без каких-либо сложностей добавить вторую секцию блока "if-then" после ключевого слова "else"!

if УСЛОВИЕ
then
команда1
команда2
...
командаn
else
команда1
команда2
...
командаn
fi

Давайте воспользуемся этой информацией для создания еще одного простого сценария:

Сценарий для тестирования условной инстукции

Очевидно, что перед каждой из строк сценария были оставлены необходимые отступы. Если вы рассмотрите код сценария более внимательно, вы наверняка обратите внимание на то, что в нем используются квадратные скобки ("[" и "]"), а не команда "test". На самом деле, в нашем случае они выполняют аналогичные функции, причем по ряду причин вы, скорее всего, столкнетесь с такими же скобками и в других сценариях командной оболочки, поэтому с данного момента мы будем использовать их.

А это вывод данного сценария:

Результат исполнения сценария

Да, все настолько просто!

Что делать дальше?

Теперь, когда вы знаете о том, как использовать условную инструкцию "if-the-else", вы можете выполнять проверки тех или иных условий в своих сценариях командной оболочки. Например, вы можете создать сценарий, который будет выполнять расчет хэша файла по алгоритму md5 и сравнивать этот хэш с хэшем из специального файла с целью проверки их совпадения.

Если вы хотите заняться самостоятельной работой, вы можете создать полезный сценарий с циклом for и с условными инструкциями вместо команд для чтения строк из файла…

Мы приближаемся к наиболее интересным статьям серии "Разработка сценариев командной оболочки для начинающих". Если вы пропустили предыдущие статьи серии, вы можете перейти по ссылкам из следующего списка:

  1. Вводная информация о разработке сценариев командной оболочки
  2. Использование циклов for
  3. Дополнительные системные команды

Если вы создавали или использовали сценарии командной оболочки с условными инструкциями "if-then-else" и циклами "for", поделитесь своими соображениями в разделе комментариев!