Bash программирование: Условный оператор if.
Bash. Условный оператор if.
Описание.
Условный оператор if в Bash позволяет выполнять определённые команды или действия в зависимости от истинности заданного условия. Это конструкция для контроля потока выполнения скриптов, которая позволяет принимать решения на основе значений переменных, результатов команд и других условий.
Если кратко, то условный оператор if позволяет проверить условие и от полученного результата выполнить один или другой блок кода.
Синтаксис.
Синтаксис примерно такой:
if [[ условие ]]; then
команды
elif [[ условие ]]; then
команды
else
команды
fi
Можно использовать несколько elif, или убрать elif и else если они не требуются.
Помимо двойных квадратных скобок можно применять одинарные двойные и двойные круглые. Но двойные квадратные скобки — более универсальны, и позволяют делать все тоже самое что и одинарные квадратные и двойные круглые. Поэтому легче запомнить однотипные конструкции с двойными квадратными скобками.
Сравнение чисел.
В таком сравнении используются следующие операторы:
-eq— равно;-ne— не равно;-gt— больше;-ge— больше или равно;-lt— меньше;-le— меньше или равно.
Рассмотрим пример — скрипт на bash, который считывает переменные a и bс консоли, принимает решение о том, что равно (-eq) или не равно (-ne) и выводит соответствующие запросы:
$ cd ~
$ mcedit test-if.sh
$ cat test-if.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A: " a
# Запрос на ввод переменной B
read -p "Введите переменную B: " b
# Проверка условий
if [[ "$a" -eq "$b" ]]; then
echo "$a равно $b"
elif [[ "$a" -ne "$b" ]]; then
echo "$a не равно $b"
else
echo "A и B равны"
fi
$ bash ~/test-if.sh
Ответ:

Как это работает:
read -p "Введите переменную A: " a— выводит сообщение“Введите переменную A:”и ожидает ввода пользователя. Введенное значение сохраняется в переменнуюa.read -p "Введите переменную B: " b— аналогично, выводит сообщение“Введите переменную B:”и сохраняет введенное значение в переменнуюb.- Далее скрипт проверяет условия и выводит соответствующее сообщение в зависимости от значений переменных
aиb.
Сравнение строк.
Строки сравниваются оператором <, >, =.
Например:
$ cd ~
$ mcedit test-if-2.sh
$ cat test-if-2.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A: " a
# Запрос на ввод переменной B
read -p "Введите переменную B: " b
# сравниваем числа
echo "Сравниваем числа:"
if [[ "$a" -gt "$b" ]]; then
echo "$a больше $b"
elif [[ "$a" -lt "$b" ]]; then
echo "$a меньше $b"
else
echo "Числа равны!"
fi
# сравниваем строки
echo "Сравниваем строки:"
if [[ "$a" > "$b" ]]; then
echo "$a больше $b"
elif [[ "$a" < "$b" ]]; then
echo "$a меньше $b"
else
echo "Количество символов равно!"
fi
$ bash ~/test-if-2.sh
Ответ:

Сравнение чисел и сравнение строк.
В таком сравнении используются следующие операторы:
-ne— не равно, если вы сравниваете числа;!=— не равно, если вы сравниваете строки.
При сравнении по символам надо иметь в виду, что:
- Оператор
-neсравнивает числа, а!=сравнивает строки. - Если нужно сравнить длину строк, надо использовать операторы
${#a}и${#b}. - Строки с числами “
01” и “02” не равны по содержимому, но их длина одинакова.
Сравнение чисел (-ne).
Когда используется оператор -ne, bash интерпретирует переменные a и b как числа.
В этом случае:
a=01 интерпретируется как число 1.
b=02 интерпретируется как число 2.
Поскольку 1 и 2 — это разные числа, условие [[ “$a” -ne “$b” ]] возвращает true.
Ответ:
01 не равно по величине с 02
Сравнение строк (!=).
Когда вы используете оператор !=, Bash интерпретирует переменные a и b как строки.
В этом случае:
a=01 — это строка, состоящая из символов 0 и 1.
b=02 — это строка, состоящая из символов 0 и 2.
Поскольку строки “01” и “02” не равны (они содержат разные символы), условие [[ “$a” != “$b” ]] возвращает true.
Ответ:
01 не равно по символам с 02
Сравнение символов в строках (${#a} и ${#b}).
Вопрос:
Почему не выводится “Количество символов равно!”, если ввести a=01, а b=02, хотя в a — это 2 символа и в b — это 2 символа?
Ответ:
Потому что операторы -ne и != не проверяют количество символов в строках. Они сравнивают строки по их содержимому.
Если нужно проверить, равны ли строки по длине, нужно использовать другую конструкцию.
Например:
$ cd ~
$ mcedit test-if-dlina.sh
$ cat test-if-dlina.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A: " a
# Запрос на ввод переменной B
read -p "Введите переменную B: " b
# Сравниваем длину строк
if [[ ${#a} -ne ${#b} ]]; then
echo "Длина строки $a не равна длине строки $b"
else
echo "Длина строки $a равна длине строки $b"
fi
Здесь ${#a} и ${#b} возвращают длину строк a и b соответственно.
$ bash test-if-dlina.sh
Ответ:

Итоговый демонстрационный скрипт.
Посмотрим как это всё работает:
$ cd ~
$ mcedit test-if-3.sh
$ cat test-if-3.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A: " a
# Запрос на ввод переменной B
read -p "Введите переменную B: " b
# Сравниваем числа
echo "Сравниваем числа:"
if [[ "$a" -ne "$b" ]]; then
echo "$a не равно по величине с $b"
else
echo "Числа равны!"
fi
# Сравниваем строки
echo "Сравниваем строки:"
if [[ "$a" != "$b" ]]; then
echo "$a не равно по символам с $b"
else
echo "Строки равны!"
fi
# Сравниваем длину строк
echo "Сравниваем длину строк:"
if [[ ${#a} -ne ${#b} ]]; then
echo "Длина строки $a не равна длине строки $b"
else
echo "Длина строки $a равна длине строки $b"
fi
$ bash test-if-3.sh
Ответ:

Обработка пустой строки.
В сравнении строк применяются не только бинарные операторы, где сравниваются две строки, а также унарные, где смотрится является ли строка пустой или нет.
Обратите внимание! Здесь обрабатывается только одна строка, поэтому оператор называется унарным:
[[ -z "$a" ]]— является ли строка пустой;[[ -n "$a" ]]— является ли строка не пустой.
Пример с пустой строкой:
$ cd ~
$ mcedit test-if-empty.sh
$ cat test-if-empty.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A (ENTER чтобы ввести пустое значение): " a
if [[ -z "$a" ]]; then
echo "Строка пустая!"
elif [[ -n "$a" ]]; then
echo "Строка не пустая!"
fi
$ bash test-if-empty.sh
Ответ:

Булевы операторы.
Булевы операторы ! (нет), && (и), || (или) также можно использовать с if:
[[ условие ]] && [[ условие ]]
Например:
$ cd ~
$ mcedit test-if-boolean.sh
$ cat test-if-boolean.sh
#!/bin/bash
# Запрос на ввод переменной A
read -p "Введите переменную A: " a
# Проверка, что введенное значение — число
if ! [[ "$a" =~ ^[0-9]+$ ]]; then
echo "Ошибка: переменная A должна быть числом."
exit 1
fi
# Запрос на ввод переменной B
read -p "Введите переменную B: " b
# Проверка, что введенное значение — число
if ! [[ "$b" =~ ^[0-9]+$ ]]; then
echo "Ошибка: переменная B должна быть числом."
exit 1
fi
# Демонстрация булевых операторов с if
# Пример 1: Оператор ! (НЕ)
echo "Пример 1: Оператор ! (НЕ)"
if ! [[ "$a" -eq "$b" ]]; then
echo "$a не равно $b (условие истинно, потому что $a не равно $b)"
else
echo "$a равно $b (условие ложно)"
fi
# Пример 2: Оператор && (И)
echo -e "\nПример 2: Оператор && (И)"
if [[ "$a" -eq "$a" ]] && [[ "$b" -eq "$b" ]]; then
echo "$a равно $a И $b равно $b (условие истинно, потому что оба выражения истинны)"
else
echo "Условие ложно (хотя бы одно из выражений ложно)"
fi
# Пример 3: Оператор || (ИЛИ)
echo -e "\nПример 3: Оператор || (ИЛИ)"
if [[ "$a" -eq "$b" ]] || [[ "$b" -eq "$b" ]]; then
echo "$a равно $b ИЛИ $b равно $b (условие истинно, потому что хотя бы одно выражение истинно)"
else
echo "Условие ложно (оба выражения ложны)"
fi
# Пример 4: Комбинация операторов
echo -e "\nПример 4: Комбинация операторов"
if ! [[ "$a" -eq "$b" ]] && [[ "$b" -eq "$b" ]] || [[ "$a" -eq "0" ]]; then
echo "$a не равно $b И $b равно $b ИЛИ $a равно 0 (условие истинно, потому что $a не равно $b И $b равно $b)"
else
echo "Условие ложно"
fi
$ bash test-if-boolean.sh
Ответ:

Проверка файлов.
С помощью if можно проверить существует ли файл, является ли файл файлом или каталогом и многое другое.
Унарные операторы:
-e— объект существует (файл или каталог).-f— объект существует и является файлом.-s— файл не пуст (имеет не нулевой размер).-d— файл является каталогом.-b— файл является блочным устройством.-c— файл является символьным устройством.-p— файл является каналом.-h— файл является символической ссылкой.-S— файл является сокетом.-t— является ли дескриптор файла открытым и связанным с терминалом. Например для проверкиstdin [ -t 0 ]илиstdout [ -t 1 ].-r— файл доступен для чтения (пользователю, запустившему сценарий).-w— файл доступен для записи (пользователю, запустившему сценарий).-x— файл доступен для исполнения (пользователю, запустившему сценарий).-O— вы являетесь владельцем файла.-G— вы принадлежите к той же группе, что и файл.
Бинарные операторы:
f1 -nt f2— файл f1 более новый, чем f2.f1 -ot f2— файл f1 более старый, чем f2.f1 -ef f2— файлы f1 и f2 являются «жесткими» ссылками на один и тот же файл.
Использование команды вместо условия.
В этом случае используется такая конструкция:
if команда; then
Если команда завершилась с кодом выхода 0, то значит условие выполнилось.
Например:
$ cd ~
$ mcedit fruits.txt
$ cat fruits.txt
яблоко
слива
груша
вишня
$ mcedit test-if-fruits.sh
$ cat test-if-fruits.sh
#!/bin/bash
if grep вишня fruits.txt; then
echo "Вишня в тексте есть!"
fi
$ bash test-if-fruits.sh
Ответ:

На этом все!
Оригиналы источников информации.
- telegra.ph «Bash. Условный оператор if».