Как сравнить строки в Bash

При написании сценариев Bash вам часто нужно сравнивать две строки, чтобы проверить, равны они или нет. Две строки равны, если они имеют одинаковую длину и содержат одинаковую последовательность символов.

В этом руководстве описывается, как сравнивать строки в Bash.

Операторы сравнения

Операторы сравнения — это операторы, которые сравнивают значения и возвращают истину или ложь. При сравнении строк в Bash вы можете использовать следующие операторы:

  • string1 = string2 и string1 == string2 — оператор равенства возвращает истину, если операнды равны.
    • Используйте оператор = с командой test [ .
    • Используйте оператор == с командой [[ для сопоставления с образцом.
  • string1 != string2 — оператор неравенства возвращает истину, если операнды не равны.
  • string1 =~ regex — Оператор регулярного выражения возвращает истину, если левый операнд совпадает с расширенным регулярным выражением справа.
  • string1 > string2 — оператор "больше" возвращает истину, если левый операнд больше правого, отсортированный в лексикографическом (алфавитном) порядке.
  • string1 < string2 — оператор «меньше» возвращает истину, если правый операнд больше правого, отсортированный в лексикографическом (алфавитном) порядке.
  • -z string — Истина, если длина строки равна нулю.
  • -n string — Истина, если длина строки отлична от нуля.

При сравнении строк следует учитывать несколько моментов:

  • Между бинарным оператором и операндами должен использоваться пробел.
  • Всегда используйте двойные кавычки вокруг имен переменных, чтобы избежать проблем с разделением слов или подстановкой слов.
  • Bash не разделяет переменные по «типу», переменные обрабатываются как целые или строковые в зависимости от контекста.

Проверьте, равны ли две строки

В большинстве случаев при сравнении строк вам нужно проверить, равны ли строки или нет.

Следующий сценарий использует оператор if и команду test [ чтобы проверить, совпадают ли строки с оператором = :

#!/bin/bash

VAR1="Linuxize"
VAR2="Linuxize"

if [ "$VAR1" = "$VAR2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

Когда сценарий будет выполнен, он напечатает следующий вывод.

Strings are equal.

Вот еще один сценарий, который принимает ввод от пользователя и сравнивает заданные строки. В этом примере мы будем использовать команду [[ и оператор == .

#!/bin/bash

read -p "Enter first string: " VAR1
read -p "Enter second string: " VAR2

if [[ "$VAR1" == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

Запустите сценарий и введите строки при появлении запроса:

Enter first string: Linuxize
Enter second string: Ubuntu
Strings are not equal.

Вы также можете использовать логические и && и или || для сравнения строк:

[[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal"
Not equal

Проверьте, содержит ли строка подстроку

Есть несколько способов проверить, содержит ли строка подстроку.

Один из подходов — использовать окружение подстроки символами звездочки * что означает соответствие всем символам.

#!/bin/bash

VAR='GNU/Linux is an operating system'
if [[ $VAR == *"Linux"* ]]; then
  echo "It's there."
fi

Скрипт отобразит следующее:

It's there.

Другой вариант — использовать оператор регулярного выражения =~ как показано ниже:

#!/bin/bash

VAR='GNU/Linux is an operating system'
if [[ $VAR =~ .*Linux.* ]]; then
  echo "It's there."
fi

Точка, за которой следует звездочка .* Соответствует нулю или более вхождений любого символа, кроме символа новой строки.

Проверьте, пуста ли строка

Довольно часто вам также нужно будет проверить, является ли переменная пустой строкой или нет. Вы можете сделать это с помощью операторов -n и -z .

#!/bin/bash

VAR=''
if [[ -z $VAR ]]; then
  echo "String is empty."
fi
String is empty.
#!/bin/bash

VAR='Linuxize'
if [[ -n $VAR ]]; then
  echo "String is not empty."
fi
String is not empty.

Сравнение строк с оператором Case

Вместо использования тестовых операторов вы также можете использовать оператор case для сравнения строк:

#!/bin/bash

VAR="Arch Linux"

case $VAR in

  "Arch Linux")
    echo -n "Linuxize matched"
    ;;

  Fedora | CentOS)
    echo -n "Red Hat"
    ;;
esac
Linuxize matched.

Лексикографическое сравнение

Лексикографическое сравнение — это операция, при которой две строки сравниваются в алфавитном порядке путем последовательного сравнения символов в строке слева направо. Такое сравнение используется редко.

Следующие сценарии лексикографически сравнивают две строки:

#!/bin/bash

VAR1="Linuxize"
VAR2="Ubuntu"

if [[ "$VAR1" > "$VAR2" ]]; then
    echo "${VAR1} is lexicographically greater then ${VAR2}."
elif [[ "$VAR1" < "$VAR2" ]]; then
    echo "${VAR2} is lexicographically greater than ${VAR1}."
else
    echo "Strings are equal"
fi

Скрипт выдаст следующее:

Ubuntu is lexicographically greater than Linuxize.

Выводы

Сравнение строк — одна из самых основных и часто используемых операций в сценариях Bash. После прочтения этого руководства вы должны хорошо понимать, как сравнивать строки в Bash. Вы также можете ознакомиться с нашим руководством по объединению строк .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий