Bash [[]和[]字符串比较器的不同结果<&引用;

Bash [[]和[]字符串比较器的不同结果<&引用;,bash,sh,Bash,Sh,我在做一些测试,我不明白为什么这两个结果是不同的。第一个似乎是正确的,因为在新月形排列中,“f”比“f”先出现 $ [[ "Foo" < "foo" ]] $ echo $? 1 $[[“Foo”运算符。如果使用bash,则外部命令应该无关,除非明确给出完整路径/usr/bin/test) 你的问题同时被标记为“bash”和“sh”。如果你在使用bash,你可能应该使用bash特有的[特性,而不是[。如果你想要更大的可移植性(例如,如果你的脚本可能与bash以外的shell一起使用),你

我在做一些测试,我不明白为什么这两个结果是不同的。第一个似乎是正确的,因为在新月形排列中,“f”比“f”先出现

$ [[ "Foo" < "foo" ]]
$ echo $?
1
$[[“Foo”<“Foo”]]
$echo$?
1.
那么为什么这个是不正确的呢

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

BSD
test
实现
[
[
都内置在
bash
中。[
相当于
test
命令,也是一个内置命令。(嗯,几乎相当;
[
需要匹配的
][/code>,
test
没有。)

根据bash手册:

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

(伯恩壳牌公司的内置设备已记录在案)

但是
[[[
..
]
中的表达式遵循以下规则:

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

(还有另一个
测试
/
[
作为GNU coreutils包的一部分提供的命令,通常是
/usr/bin/test
。此命令不提供POSIX未指定的
/code和code>
运算符。如果使用bash,则外部命令应该无关,除非明确给出完整路径
/usr/bin/test


你的问题同时被标记为“bash”和“sh”。如果你在使用bash,你可能应该使用bash特有的
[
特性,而不是
[
。如果你想要更大的可移植性(例如,如果你的脚本可能与bash以外的shell一起使用),你不能依赖
[
内置代码,你不能假设
[
test
支持

没有指定
@CharlesDuffy:但是如果您使用的是bash,您可以合理地依赖它提供的功能。@KeithThompson,当然,但是如果您专门针对bash,您应该使用
[[]]
(不包括问题上的
sh
标签)。有两种不同的GNU实现
test
/
[
。其中一个是外部命令,是coreutils包的一部分,但这里的相关命令是bash内置命令。coreutils
test
命令不提供
运算符。@KeithThompson,嗯,你说得对——这是一个BSD,我正在查看文档,它确实提供了
de>
$ (export LC_COLLATE=C; [[ "Foo" < "foo" ]]; echo $?)
0