我正在做一些测试,但我无法理解为什么有两个结果不同。第一个看起来是正确的,因为在新月形的过程中,角色“f'首先是' F'
$ [[ "Foo" < "foo" ]]
$ echo $?
1
那为什么这个不正确?
$ [ "Foo" \< "foo" ]
$ echo $?
0
答案 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,因此所有答案必须在特定实施的上下文中。