如何在 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