天天看點

Bash字元串處理(與Java對照) - 10.判斷兩個字元串是否相等(不等)Bash字元串處理(與Java對照) - 10.判斷兩個字元串是否相等(不等)

Bash字元串處理(與Java對照) - 10.判斷兩個字元串是否相等(不等)

In Java

String.equals & String.equalsIgnoreCase

boolean     equals(Object anObject)

          比較此字元串與指定的對象。

boolean     equalsIgnoreCase(String anotherString)

          将此 String 與另一個 String 進行比較,不考慮大小寫。

if (s1.equals(s2)) {

}

注意:一定要保證s1 != null,否則會抛出異常。

StringUtils.equals & StringUtils.equalsIgnoreCase

在Apache Commons Lang中的StringUtils類提供了equals和equalsIgnoreCase靜态方法,它的好處是兩個字元串都可以是null。

org.apache.commons.lang.StringUtils equals方法 寫道 public static boolean equals(String str1, String str2)

Compares two Strings, returning true if they are equal.

nulls are handled without exceptions. Two null references are considered to be equal. The comparison is case sensitive.

StringUtils.equals(null, null) = true

StringUtils.equals(null, "abc") = false

StringUtils.equals("abc", null) = false

StringUtils.equals("abc", "abc") = true

StringUtils.equals("abc", "ABC") = false

Parameters:

str1 - the first String, may be null

str2 - the second String, may be null

Returns:

true if the Strings are equal, case sensitive, or both null   org.apache.commons.lang.StringUtils equalsIgnoreCase方法 寫道 public static boolean equalsIgnoreCase(String str1, String str2)

Compares two Strings, returning true if they are equal ignoring the case.

nulls are handled without exceptions. Two null references are considered equal. Comparison is case insensitive.

StringUtils.equalsIgnoreCase(null, null) = true

StringUtils.equalsIgnoreCase(null, "abc") = false

StringUtils.equalsIgnoreCase("abc", null) = false

StringUtils.equalsIgnoreCase("abc", "abc") = true

StringUtils.equalsIgnoreCase("abc", "ABC") = true

Parameters:

str1 - the first String, may be null

str2 - the second String, may be null

Returns:

true if the Strings are equal, case insensitive, or both null

In Bash

判斷字元串相等

格式1:test "$S1" = "$S2"

格式2:[ "$S1" = "$S2" ]

格式3:test "$S1" == "$S2"

格式4:[ "$S1" == "$S2" ]

格式5:[[ $S1 = $S2 ]]

格式6:[[ $S1 == $S2 ]]

在Bash中關于=和==的說法

man bash 寫道 string1 == string2

True if the strings are equal. = may be used in place of == for strict POSIX compliance.

[[email protected] ~]# S1=Hello

[[email protected] ~]# S2=Hello

[[email protected] ~]# test "$S1" = "$S2"  && echo "equals"

equals

[[email protected] ~]# [ "$S1" = "$S2" ]  && echo "equals"   

equals

[[email protected] ~]# test "$S1" == "$S2"  && echo "equals"

equals

[[email protected] ~]# [ "$S1" == "$S2" ]  && echo "equals" 

equals

[[email protected] ~]# [[ "$S1" = "$S2" ]]  && echo "equals"

equals

[[email protected] ~]# [[ "$S1" == "$S2" ]]  && echo "equals"

equals

[[email protected] ~]#

[[email protected] ~]# S1=Hello

[[email protected] ~]# S2=hello

[[email protected] ~]# test "$S1" = "$S2"  && echo "equals"

[[email protected] ~]# [ "$S1" = "$S2" ]  && echo "equals"   

[[email protected] ~]# test "$S1" == "$S2"  && echo "equals"

[[email protected] ~]# [ "$S1" == "$S2" ]  && echo "equals" 

[[email protected] ~]# [[ "$S1" = "$S2" ]]  && echo "equals"

[[email protected] ~]# [[ "$S1" == "$S2" ]]  && echo "equals"

[[email protected] ~]#

判斷字元串不相等

格式1:test "$S1" != "$S2"

格式2:[ "$S1" != "$S2" ]

格式3:[[ $S1 != $S2 ]]

注意在[[ ]]中,變量的引用可以不加雙引号,這是與[ ]的不同之處。

也可以在判斷字元串相等的基礎上加上邏輯非(!)可以得到更多方法,比如:[ ! "$S1" == "$S2" ]

[[email protected] ~]# S1=Hello

[[email protected] ~]# S2=Hello

[[email protected] ~]# test "$S1" != "$S2" && echo "not equals"

[[email protected] ~]# [ "$S1" != "$S2" ] && echo "not equals"     

[[email protected] ~]# [[ $S1 != $S2 ]] && echo "not equals"   

[[email protected] ~]# S1=Hello

[[email protected] ~]# S2=hello

[[email protected] ~]# test "$S1" != "$S2" && echo "not equals"

not equals

[[email protected] ~]# [ "$S1" != "$S2" ] && echo "not equals"

not equals

[[email protected] ~]# [[ $S1 != $S2 ]] && echo "not equals"

not equals

[[email protected] ~]#

比較字元串是否相等,不區分大小寫

采用shopt指令啟用不區分大小寫比對模式,隻在case語句和[[ ]]中有效。

man bash: shopt 寫道 shopt

    Toggle the values of variables controlling optional shell behavior.

-s Enable (set) each optname.

-u Disable (unset) each optname.

nocasematch

    If set, bash matches patterns in a case-insensitive fashion when performing matching while exe-

cuting case or [[ conditional commands.  

[[email protected] ~]# shopt -s nocasematch

[[email protected] ~]# [ "$S1" = "$S2" ] && echo "equals ignore case"

[[email protected] ~]# [[ "$S1" = "$S2" ]] && echo "equals ignore case"

equals ignore case

[[email protected] ~]# case "$S1" in "$S2") echo "equals ignore case"; esac

equals ignore case

[[email protected] ~]# shopt -u nocasematch

[[email protected] ~]# [[ "$S1" = "$S2" ]] && echo "equals ignore case"   

[[email protected] ~]# case "$S1" in "$S2") echo "equals ignore case"; esac

[[email protected] ~]#

包裝成一個函數

equals_ignore_case(){
    shopt -s nocasematch
    [[ $1 == $2 ]]
    local rc=$?
    shopt -u nocasematch
    return $rc
}      

[[email protected] ~]# equals_ignore_case "Hello" "hello" && echo "equals ignore case"

equals ignore case

[[email protected] ~]# equals_ignore_case "Hello" "Qello" && echo "equals ignore case"

[[email protected] ~]# equals_ignore_case "Hello" "hello" && echo "equals ignore case"

equals ignore case

[[email protected] ~]# equals_ignore_case "Hello" "helLo" && echo "equals ignore case"  

equals ignore case

[[email protected] ~]#

如果其中一個字元串是常量,可以采用 [[ ]] 中 == 的模式比對來進行。(不用shopt開啟不區分大小寫)

比如:[[ $S1 == [Hh][Ee][Ll][Ll][Oo] ]]

麻煩的地方就是後面那個比對模式要每個字元提供大小寫的形式。

[[email protected] ~]# S1=Hello

[[email protected] ~]# [[ $S1 == [Hh][Ee][Ll][Ll][Oo] ]] && echo "equals ignore case"    

equals ignore case

[[email protected] ~]# S1=HeLlo

[[email protected] ~]# [[ $S1 == [Hh][Ee][Ll][Ll][Oo] ]] && echo "equals ignore case"

equals ignore case

[[email protected] ~]#

還可以采用case文法結構。

比如:case "$S1" in [Hh][Ee][Ll][Ll][Oo]) echo "equals ignore case";; esac

[[email protected] ~]# S1=hEllo

[[email protected] ~]# case "$S1" in [Hh][Ee][Ll][Ll][Oo]) echo "equals ignore case";; esac

equals ignore case

[[email protected] ~]# S1=hellO

[[email protected] ~]# case "$S1" in [Hh][Ee][Ll][Ll][Oo]) echo "equals ignore case";; esac

equals ignore case

[[email protected] ~]#

如果比較的雙方都是變量,上面的技巧就無法做到了。

下面的方法是将兩個字元串都變成大寫的形式(使用tr指令),然後進行判斷。

[ "$(echo "$S1" | tr [a-z] [A-Z])" == "$(echo "$S2" | tr [a-z] [A-Z])" ]

[[email protected] ~]# S1=Hello

[[email protected] ~]# S2=helLo

[[email protected] ~]# [ "$(echo "$S1" | tr [a-z] [A-Z])" == "$(echo "$S2" | tr [a-z] [A-Z])" ] && echo "equals ignore case"

equals ignore case

[[email protected] ~]#

本文連結:http://codingstandards.iteye.com/blog/1175608   (轉載請注明出處)

傳回目錄:Java程式員的Bash實用指南系列之字元串處理(目錄) 

上節内容:Bash字元串處理(與Java對照) - 9.擷取字元串指定位置的字元、周遊字元串中的字元

下節内容:Bash字元串處理(與Java對照) - 11.比較兩個字元串大小(字典順序、數值比較)