为什么“[[ '>' > '0' ]]” return 为假而“[ '>' \> '0' ]” return 为真?

Why does "[[ '>' > '0' ]]" return false while "[ '>' \> '0' ]" returns true?

字符串比较是ASCII比较,所以

[ '>' \> '0' ]

应该与

有相同的结果
[[ '>' > '0' ]]

但为什么第一个 return 为真 (0) 而第二个 return 为假 (1)?

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

如果您将 LC_ALL 设置为 C[[ 变体将 return true:

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

根据图表 here,我的默认语言环境 en_US.UTF-80 之前 > 排序 。将本地切换为 C(基于原始字节值而不是特定于文化的排序的排序规则),会改变行为。

如果你在 Linux(这可能也适用于其他 UNIX 兄弟),locale 命令应该告诉你当前的设置是什么,如果你想 investigate/confirm:

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=