1

我做了一个简短的测试,因为冒号字符似乎有:问题。脚本打印字符,很明显冒号出现在 之后9,但在运行字符串测试之后,它看起来实际上出现在正斜杠之后/。是什么赋予了?

$ cat chartest.sh
#!/bin/sh
echo $LANG

for i in {33..126}; do
  printf -v hex "%x" "$i"
  printf "\x$hex"
done

echo
[[ : > 9 ]] && echo true || echo false
[[ : > / ]] && echo true || echo false

$ ./chartest.sh
en_US.UTF-8
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
qrstuvwxyz{|}~
false
true

我发现如果我使用旧的测试功能它可以正常工作

$ [ : \> 9 ] && echo true || echo false
true

也相关

http://tiswww.case.edu/php/chet/bash/COMPAT

4

1 回答 1

2

当你用 [[ > ]] 比较字符串时,bash 使用区域感知比较。在 en_US.UTF-8 中,最常见的标点符号出现在数字之前,而不管 ASCII 代码(或 Unicode 代码点,就此而言)。如果您将您的语言环境(或至少 LC_COLLATE)更改为 C 或 C.UTF-8,那么您应该会发现排序规则更符合您的预期。

请注意,区域感知比较并不像音译代码那么简单。我个人认为有必要将我的 LANG 设置为 C,否则该sort实用程序对空格的处理会破坏我的许多脚本。我不知道为什么 Ubuntu 选择这样做:

$ echo $LANG
en_GB.UTF-8
$ [[ "week night" > "wee knight" ]] && echo yes || echo no
yes
$ [[ "week light" > "wee knight" ]] && echo yes || echo no
no
于 2012-10-02T21:20:28.303 回答