2014-11-03 50 views
5

我在bash腳本比較兩個字符串如下:bash的冗長字符串比較斜線

x="hello" 
y="hello" 

if [[ "$x" != "$y" ]]; then 
    echo "different" 
else 
    echo "same" 
fi 

這種比較有效。當我與-x執行腳本,比較仍然有效,但它顯示輸出

+ x=hello 
+ y=hello 
+ [[ -n hello ]] 
+ [[ hello != \h\e\l\l\o ]] 
+ echo same 

我很好奇,爲什麼字符串的右側顯示爲\h\e\l\l\o而不是hello

回答

4

可以簡單的解釋出於同樣的原因,左手邊沒有引號。

-x向您顯示了它的運行等效但不完全的表示。 =!=[[ ... ]]的右側被匹配爲模式。

從手冊:

當==和=運營商所使用的,串給操作者的右側被認爲是一個圖案和匹配根據下模式匹配下面描述的規則!。 ....模式的任何部分可能會被引用來強制它被匹配爲一個字符串。

-x輸出由於某種原因選擇使用轉義而不是引用來禁用那裏的模式匹配。

+0

感謝您的解釋。 – 2014-11-03 18:52:55

0

當使用===,並在!=[[,右側字符串可以包含水珠(*?等)。

您示例中的反斜槓並不是必需的,儘管它們不會造成傷害。如果右側字符串包含可能的通配符,則需要它們。例如:

$ set -x 
$ [[ hi == 'hi*' ]]; echo $? 
+ [[ hi == \h\i\* ]] 
+ echo 1 
1 
$ [[ hi == hi* ]]; echo $? 
+ [[ hi == hi* ]] 
+ echo 0 
0 
+0

我實際上沒有在那裏反斜槓,我想知道他們爲什麼顯示在詳細輸出中。 – 2014-11-03 18:52:30