如何在 Bash 中比较字符串

Suraj Joshi 2020年9月19日
如何在 Bash 中比较字符串

我们可以使用各种比较运算符比较字符串,并使用正则表达式检查字符串是否包含子字符串。

Bash 中的字符串比较

字符串比较是指检查给定的字符串是否相同。如果两个或多个字符串长度相同,并且包含相同的字符序列,那么它们就是相同的。

我们使用各种字符串比较运算符,根据条件返回真或假。一些被广泛使用的字符串比较运算符可以列举如下。

string1 = string2 [ 命令一起使用的等价运算符,如果两个操作数相等,则返回 true
string1 == string2 相等运算符与 [[ 命令一起使用,如果两个操作数都相等,则返回 true
string1 != string2 不等式运算符,如果两个操作数不相等,返回 true
string1 =~ regex Regex 运算符,如果 string1 符合扩展的 regex,则返回 true
string1 > string2 大于运算符,如果 string1 大于 string2,则根据词法(字母)顺序返回 true
string1 < string2 小于运算符,如果 string1 小于 string2,则根据词法(字母)顺序返回 true
-z string 如果 string 的长度是 0,返回 true
-n string 如果 string 的长度不是 0,返回 true
String1="Hello World!!"
String2="Hello World!!"

String3="Delft Stack"

if [ "$String1" = "$String2" ]; then
    echo "String1 and String2 are equal."
else
    echo "String1 and String2 are not equal."
fi

if [[ "$String1" == "$String2" ]]; then
    echo "String1 and String2 are equal."
else
    echo "String1 and String2 are not equal."
fi

if [[ "$String1" != "$String3" ]]; then
    echo "String1 and String3 are not equal."
else
    echo "String1 and String3 are equal."
fi

输出:

String1 and String2 are equal.
String1 and String2 are equal.
String1 and String3 are not equal.

这里,如果我们先用 = 运算符比较 String1String2。由于 String1String2 都具有相同的长度,具有相同的字符序列,比较运算符返回 true,因此我们得到 String1 and String2 are equal. 作为程序中第一个 if-else 块的输出。

同样,在第二个程序中,我们使用 == 运算符比较 String1String2。在这种情况下,我们需要使用 [[ 进行比较。

最后,我们使用!= 运算符比较 String1String3

Bash 中的词法比较

词法比较是指根据字母顺序来比较字符串。对于词法比较,我们使用 >< 运算符。

name1="Kamal"
name2="Abinash"

if [[ "$name1" > "$name2" ]]; then
    echo "${name1} is greater then ${name2}."
elif [[ "$name1" < "$name2" ]]; then
    echo "${name2} is greater than ${name1}."
else
    echo "Both the namees are equal"
fi

输出:

Kamal is greater then Abinash.

在这个程序中,name1name2 进行了词法比较。由于 K 在字母顺序中排在 A 之后,K 的值比 A 高,因此"$name1" > "$name2"返回 true,我们得到 Kamal is greater then Abinash. 作为输出。

检查一个字符串是否为空

我们使用"-n “和”-z “运算符来检查字符串是否为空。

String=""
if [[ -z $String ]]; then
  echo "The variable String is an empty string."
fi

输出:

The variable String is an empty string.

在这个程序中,string 是一个空变量。由于 -z 运算符返回 true,如果 string 的长度是 0,因此我们得到 The variable String is an empty string. 作为给定程序的输出。

String="Test"
if [[ -n $String ]]; then
  echo "The variable String is not an empty string."
fi

输出:

The variable String is not an empty string.

在这个程序中,String 是一个非空变量。由于 -n 运算符返回 true,如果 string 的长度不是 0,因此我们得到 The variable String is not an empty string. 作为给定程序的输出。

检查一个字符串是否包含子字符串

要检查一个字符串是否包含子字符串,我们可以使用 =~Regex)运算符。

如果字符串符合扩展的 regex 表达式,regex 运算符返回 true。我们必须制作一个合适的 regex 表达式进行比较。

String='My name is Delft.'
if [[ $String =~ .*Delft.* ]]; then
  echo "The given string has Delft on it."
fi

输出:

The given string has Delft on it.

这里,.*Delft.*是要匹配的 regex 表达式,它表示匹配 Delft. 之前和之后的任何字符串,0 个或更多字符。它检查字符串中是否有子字符串 Delft

由于 Delft 存在于给定的字符串中,给定的条件得到满足,我们得到 The given string has Delft on it. 作为输出。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn