🎓 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».