如何在 Bash 中比较字符串

在编写 Bash 脚本时,您通常需要比较两个字符串以检查它们是否相等。当两个字符串具有相同的长度并且包含相同的字符序列时,它们是相等的。

本教程描述了如何比较 Bash 中的字符串。

比较运算符

比较运算符是比较值并返回 true 或 false 的运算符。在比较 Bash 中的字符串时,您可以使用以下运算符:

  • string1 = string2string1 == string2- 如果操作数相等的平等运算符返回 true
    • 使用 = 带有 test   [ 命令的运算符。
    • 使用 == 带有 [[ 命令的运算符进行模式匹配。
  • string1 != string2 - 如果操作数不相等,则不等运算符返回 true
  • string1 =~ regex- 如果左操作数与右侧的扩展正则表达式匹配,则正则表达式运算符返回 true
  • string1 > string2 - 如果左操作数大于按字典顺序(字母顺序)排序的右操作数,则大于运算符返回 true
  • string1 < string2 - 如果右操作数大于按字典顺序(字母顺序)排序的右操作数,则小于操作符返回 true
  • -z string - 如果字符串长度为零,则为 true
  • -n string - 如果字符串长度不为零,则为 true

以下是比较字符串时需要注意的几点:

  • 必须在二元运算符和操作数之间使用空格。
  • 始终在变量名称周围使用双引号以避免任何单词拆分或通配问题。
  • Bash 不按“类型”隔离变量,变量根据上下文被视为整数或字符串。

检查两个字符串是否相等

在大多数情况下,在比较字符串时,您需要检查字符串是否相等。

以下脚本使用测试符号 [ 命令和 = 运算符检查字符串是否相等:

#!/bin/bash

VAR1="buzheng"
VAR2="buzheng"

if [ "$VAR1" = "$VAR1" ]; 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" == "$VAR1" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

运行脚本并在提示时输入字符串:

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

您还可以使用逻辑与 && 和或 || 来比较字符串:

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

检查 String 是否包含子字符串

有多种方法可以检查字符串是否包含子字符串。

一种方法是使用星号符号环绕子串, * 这意味着匹配所有字符。

#!/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

.* 是除了换行符之外的任何字符出现零或多次。

检查 String 是否为空

通常,您还需要检查变量是否为空字符串。您可以使用 -n-z 运算符来完成此操作。

#!/bin/bash

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

VAR=='buzheng'
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 "matched"
    ;;

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

词典比较

字典比较是通过从左到右依次对字符串中的字符来按字母顺序比较两个字符串的操作。这种比较很少使用。

以下脚本按字典顺序比较两个字符串:

#!/bin/bash

VAR1="buzheng"
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 buzheng.

结论

比较字符串是 Bash 脚本中最基本和最常用的操作之一。阅读本教程后,您应该很好地理解如何比较 Bash 中的字符串。您还可以查看有关字符串连接的指南。