bash详细字符串比较斜杠

时间:2014-11-03 17:53:22

标签: bash string-comparison

我在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

2 个答案:

答案 0 :(得分:8)

简单的解释是出于同样的原因,左手边没有引号。

-x向您显示其运行的等效但不准确的表示。 =中的!=[[ ... ]]的右侧与模式匹配。

从手册:

  

当使用==和!=运算符时,运算符右侧的字符串被视为模式,并根据模式匹配下面描述的规则进行匹配。 ....可以引用模式的任何部分以强制它匹配为字符串。

由于某种原因,-x输出选择使用转义代替引用来禁用那里的模式匹配。

答案 1 :(得分:0)

=中使用==!=[[时,右侧字符串可以包含整数(*?等等。)。

您的示例中的反斜杠不是必需的,尽管它们不会受到伤害。如果右侧字符串包含可能的通配符,则需要它们。例如:

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