为什么"[[ '>' > '0' ]]"返回false,而"[ '>' \> '0' ]"返回true?

3

字符串比较是ASCII比较,因此

[ '>' \> '0' ]

应该和以下结果相同

[[ '>' > '0' ]]

但是为什么第一个返回true(0),而第二个返回false(1)?
1个回答

5

[[ 使用当前语言环境进行字符串比较,[ 不会。

如果将 LC_ALL 设置为 C[[ 变种也将返回 true:

pax$ LC_ALL=;  if [[ ">" > "0" ]] ; then echo yes; fi
pax$ LC_ALL=C; if [[ ">" > "0" ]] ; then echo yes; fi
yes

我默认的语言环境是en_US.UTF-8,根据此处的图表,>0之前排序。将本地设置更改为C(基于原始字节值而不是特定于文化的排序),则行为会发生变化。
如果您使用Linux(这也可能适用于其他UNIX兄弟),locale命令应告诉您当前的设置,如果您想要调查/确认:
pax$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

我一直想知道C代表什么?难道locale值不应该设置为语言的缩写吗? - Vicente Bolea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接