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

时间:2015-04-15 08:16:37

标签: string bash comparison

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

[ '>' \> '0' ]

应与

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

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

1 个答案:

答案 0 :(得分: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

根据图表here,我的默认区域设置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=