为什么“[[ '>' > '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-8
在 0
之前 >
排序 。将本地切换为 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=
字符串比较是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-8
在 0
之前 >
排序 。将本地切换为 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=