Условный оператор If/Then в Bash. Как осуществить ветвление программной логики скрипта?

условный оператор if/then в bash. как осуществить ветвление программной логики скрипта?

Использование условного оператора

Практически любая программа требует выполнения различных наборов команд в зависимости от условий. Интерпретатор Bash оснащен специальным оператором if/then. Он способен принимать выражение и преобразовывать его результат в логическое значение «правда» или «ложь». Если результатом проверки является «правда», оператор if осуществляет выполнение содержащихся в нем команд.

В других высокоуровневых языках программирования истинному утверждению соответствует число «1», а ложному «0». Bash ведет себя иначе. При проверке входящего значения или выражения истинности соответствует число «0» а ложности «1». Это связанно с тем, что результат выражения на самом деле не преобразуется к логическому типу, он является кодом возврата программы. В Linux за успешный код завершения программы принято считать число ноль, а за ошибочный соответственно единицу.

В общем виде конструкцию применения условного оператора можно представить следующим образом «if проверяемое_выражение; then набор_команд fi». Конструкция начинается с ключевого слова if, за которым следует выражение, требующее проверки. После проверки должно располагаться ключевое слово then, свидетельствующее о начале блока команд. Если проверка входящих параметров располагается на одной строчке с then, после неё необходимо добавить точку с запятой «;». Конец блока команд должен быть завершен ключевым словом fi.

#!/bin/bash

#если файл существует, выводим сообщение
if [[ -f '/etc/passwd' ]]; then
    echo "Файл с определением пользователей существует"
fi


#получаем ввод и сверяемся со строкой пароля
password='test67'

echo -n "введите пароль: "
read string

if [[ $password = $string ]]
then
    echo "Пароль введен корректно"
else
    echo "Ошибка ввода пароля"
fi

Проверка входящих выражений

Bash позволяет осуществлять проверку условий тремя способами

Выражение Описание
[ выражение ] Одинарные квадратные скобки являются псевдонимом встроенной команды test. Они позволяют сравнивать значения друг с другом, а также проверять файлы и директории на существование при указании их имен.
[[ выражение ]] Использование двойных кавычек в условном операторе if предпочтительнее предыдущего варианта. Они не являются псевдонимом сторонней команды, а встроены в интерпретатор Bash. Это положительно сказывается на скорости выполнения. К тому же двойные квадратные скобки позволяют использовать логические операторы && или || для объединения нескольких проверок в одну.
(( арифметическая_операция )) Результат арифметической операции также принимается за логическое значение. Внутри двойных круглых скобок можно использовать операторы >, <, <=, >=, =, != для сравнения чисел.

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

Таблица операторов Bash для проверок значений в условиях

Оператор Описание
Сравнения чисел
-eq или = Равно.
-ge или >= Больше или равно.
-ne или != Не равно.
-gt или > Больше.
-lt или < Меньше.
-le или <= Меньше или равно.
Проверка файлов
-f Существует и является файлом (не директорией).
-d Существует и является директорией.
-r Доступен для чтения.
-w Доступен для записи.
-x Файл является исполняемым.
-O Принадлежит текущему пользователю.
-G Группа идентична текущему пользователю.
Сравнение строк
= Равенство строк.
!= Неравенство строк.
< Меньше по ASCII-коду.
> Больше по ASCII-коду.
-n В строке больше нуля символов.
-z В строке ноль символов.
#!/bin/bash

#два выражения, объединенных логическим "и"
if (( 4*5 > 15 )) && [ -d '/var/log/apt' ]; then
    echo 'Условие истинно'
fi

#аналогичное выражение, но с двойными скобками
if [[ 4*5 -gt 15 && -d '/var/log/apt' ]]; then
    echo 'Условие истинно'
fi

#пример арифметической операции в условии
number=145
divider=3

if (( $number/$divider > 30 )); then
    echo "${number} деленное на ${divider} равно $[$number/$divider]"
fi

Заметка
Выражение должно отделяться хотя бы одним пробелом от открывающих и закрывающих скобок. Также учитывайте, что операторы сравнения >, <, =, != можно использовать как внутри квадратных скобок, так и в круглых. Однако в квадратных скобках они применяются для сравнения строк, а внутри круглых для чисел.

Альтернативное условие Else

При использовании условного оператора if/then можно задать блок команд, который будет выполнен в случае ложности выражения. Bash позволяет сделать это за счет ключевого слова else. Поместите его в промежутке then и fi. Все команды, лежащие между else и fi, будут считаться альтернативой истинности условия.

#!/bin/bash

#проверка строки на длину и совпадение
code='4567'
string=''

echo -n 'введите проверочный код: '
read string

if [[ -n $string ]]; then
    #вложенная проверка условия
    if [[ $code = $string ]]; then
        echo 'проверочный код совпал'
    else
        echo 'код не прошел проверку'
    fi
else
    echo 'слишком короткий код'
fi

Последние публикации