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

Her*_*ert 3 string bash comparison

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

[ '>' \> '0' ]
Run Code Online (Sandbox Code Playgroud)

应该有相同的结果

[[ '>' > '0' ]]
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 5

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

如果设置LC_ALLC,[[变量将返回true:

pax$ LC_ALL=;  if [[ ">" > "0" ]] ; then echo yes; fi
pax$ LC_ALL=C; if [[ ">" > "0" ]] ; then echo yes; fi
yes
Run Code Online (Sandbox Code Playgroud)

根据此处的图表en_US.UTF-8,我的默认语言环境之前已经>排序.将本地切换为(基于原始字节值的排序而不是特定于文化的排序)会更改行为. 0C

如果你在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=
Run Code Online (Sandbox Code Playgroud)