人物故障?

时间:2012-10-02 19:40:26

标签: bash character

我做了一个简短的测试,因为似乎冒号字符:出了故障。脚本打印字符,显然冒号出现在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

1 个答案:

答案 0 :(得分:2)

将字符串与[[&gt;]进行比较时]],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