[[]]和[]字符串比较器的不同结果"<"

时间:2016-11-29 17:09:53

标签: bash sh

我正在做一些测试,但我无法理解为什么有两个结果不同。第一个看起来是正确的,因为在新月形的过程中,角色“f'首先是' F'

$ [[ "Foo" < "foo" ]]
$ echo $?
1

那为什么这个不正确?

$ [ "Foo" \< "foo" ]
$ echo $?
0

2 个答案:

答案 0 :(得分:4)

[[[都内置于bash[等同于test命令,也是内置命令。 (嗯,几乎相同; [需要匹配]test不需要。)

根据bash手册:

  

test[一起使用时,<>运算符排序   按字典顺序使用ASCII排序。

(Bourne shell builtins记录为here)。

[[ ... ]]中的表达式遵循Bash conditional expressions的规则:

  

[[一起使用时,<>运算符排序   按字典顺序使用当前区域设置。 test命令使用   ASCII排序。

(作为GNU coreutils包的一部分提供了另一个test / [命令,通常为/usr/bin/test。此命令不提供<和{{1}运算符,它们不是由POSIX指定的。如果你使用bash,外部命令应该是无关紧要的,除非你明确地给出完整路径>。)

您的问题被标记为“bash”和“sh”。如果您使用的是bash,则应该使用特定于bash的/usr/bin/test功能而不是[[。如果您想要更高的可移植性(例如,如果您的脚本可能与bash之外的shell一起使用),则不能依赖于[内置,并且您不能假设[[或{ {1}}支持[test

答案 1 :(得分:2)

test [1] 的BSD <实现,就像bash-builtin一样,不支持字符整理顺序;它仅指&#34;二进制值&#34;有问题的人物。

[[ ]] 的bash <实施字符集感知:它尊重当前语言/区域设置选择的整理顺序。

如果设置LC_COLLATE=C(指定ASCII排序顺序),那么[[ ]]也会这样做:

$ (export LC_COLLATE=C; [[ "Foo" < "foo" ]]; echo $?)
0

[1] - >不是POSIX-standardized test operator,因此所有答案必须在特定实施的上下文中。