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