如何在 Bash 中比较字符串

Suraj Joshi 2020年9月19日 Linux Bash Linux String
如何在 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. 作为输出。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn