При написании сценариев Bash часто требуется сравнить две строки, чтобы проверить, равны они или нет. Две строки равны, если они имеют одинаковую длину и содержат одинаковую последовательность символов.
Операторы сравнения
Операторы сравнения - это операторы, которые сравнивают значения и возвращают true или false. При сравнении строк в Bash можно использовать следующие операторы:
- string1 = string2 и string1 == string2 - Оператор равенства возвращает true, если операнды равны.
- Используйте оператор = с командой test [.
- Используйте оператор == с командой [[ для сопоставления с образцом.
- string1 != string2 - оператор неравенства возвращает true, если операнды не равны.
- string1 =~ regex- Оператор regex возвращает true, если левый операнд соответствует расширенному регулярному выражению справа.
- string1 > string2 - оператор greater than возвращает true, если левый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
- string1 < string2 - оператор less than возвращает истину, если правый операнд больше правого, отсортированного по лексикографическому (алфавитному) порядку.
- -z string - Истина, если длина строки равна нулю.
- -n string - Истина, если длина строки ненулевая.
При сравнении строк следует обратить внимание на несколько моментов:
- Между двоичным оператором и операндами должен быть пробел.
- Всегда используйте двойные кавычки вокруг имен переменных, чтобы избежать проблем с разделением слов или globbing.
- Bash не разделяет переменные по "типу", переменные рассматриваются как целое число или строка в зависимости от контекста.
Проверка равенства двух струн
В большинстве случаев при сравнении строк необходимо проверить, равны ли они или нет.
Следующий сценарий использует оператор if и команду test [ для проверки равенства или неравенства строк с помощью оператора =:
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash VAR1="Teststring" VAR2="Teststring" if [ "$VAR1" = "$VAR2" ]; then echo "Строки равны". else echo "Строки не равны". fi |
Когда скрипт будет выполнен, он выведет следующий результат.
1 | Строки равны |
Вот еще один сценарий, который принимает ввод от пользователя и сравнивает заданные строки. В этом примере мы будем использовать команду [[ и оператор ==.
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash read -p "Введите первую строку: " VAR1 read -p "Введите вторую строку: " VAR2 if [[ "$VAR1" == "$VAR2" ]]; then echo "Строки равны." else echo "Строки не равны". fi |
Запустите скрипт и введите строки, когда появится запрос:
1 2 3 | Введите первую строку: Test String Введите вторую строку: Bash Строки не равны. |
Для сравнения строк можно также использовать логические операторы && и ||:
1 | [[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal" |
В результате получим
1 | Не равно |
Проверка наличия в строке подстроки
Существует несколько способов проверить, содержит ли строка подстроку.
Один из подходов заключается в том, чтобы окружить подстроку символами звездочки *, что означает совпадение всех символов.
1 2 3 4 5 6 | #!/bin/bash VAR='GNU/Linux - операционная система' if [[ $VAR == *"Linux "* ]]; then echo "Содержит" fi |
Сценарий выдаст следующее эхо:
1 | Содержит |
Другой вариант - использовать оператор regex =~, как показано ниже:
1 2 3 4 5 6 | #!/bin/bash VAR='GNU/Linux - операционная система' if [[ $VAR =~ .*Linux.* ]]; then echo "Содержит". fi |
Точка, за которой следует звездочка .*, соответствует нулю или более вхождений любого символа, кроме символа новой строки.
Проверка пустой ли строки
Довольно часто возникает необходимость проверить, является ли переменная пустой строкой или нет. Это можно сделать с помощью операторов -n и -z.
1 2 3 4 5 | #!/bin/bash VAR='' if [[ -z $VAR ]]; then echo "Строка пуста" fi |
1 2 3 4 5 | #!/bin/bash VAR='Test string' if [[ -n $VAR ]]; then echo "Строка не пуста" fi |
Сравнение строк с помощью оператора Case
Вместо операторов проверки вы также можете использовать оператор case для сравнения строк:
1 2 3 4 5 6 7 8 | #!/bin/bash VAR="Arch Linux" case $VAR in "Arch Linux") echo -n "соответствует";; Fedora | CentOS) echo -n "Red Hat";; esac |
В результате получим
1 | соответствует |
Лексикографическое сравнение
Лексикографическое сравнение - это операция, при которой две строки сравниваются в алфавитном порядке путем последовательного сравнения символов в строке слева направо. Этот вид сравнения используется редко.
Следующие скрипты сравнивают две строки лексикографически:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash VAR1="RHEL" VAR2="Ubuntu" if [[ "$VAR1" > "$VAR2" ]]; then echo "${VAR1} лексикографически больше, чем ${VAR2}" elif [[ "$VAR1" < "$VAR2" ]]; then echo "${VAR2} лексикографически больше, чем ${VAR1}" else echo "Строки равны" fi |
Сценарий выведет следующее:
1 | Ubuntu лексикографически больше, чем RHEL |
Заключение
Сравнение строк - одна из самых основных и часто используемых операций в сценариях Bash. После прочтения этого руководства вы должны хорошо понимать, как сравнивать строки в Bash. Вы также можете ознакомиться с нашим руководством по конкатенации строк.