2

bash 手册的条件构造部分中=~描述的bash 运算符是否尊重语言环境?

文档使用 POSIX 扩展正则表达式提到它:

运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如在 regex3 中)

POSIX 扩展正则表达式联机帮助页man 7 regex描述了它们依赖于语言环境。特别是关于括号表达式,它说:

如果列表中的两个字符由“-”分隔,则这是整理序列中这两个(包括)之间所有字符的简写,例如,ASCII 中的“[0-9]”匹配任何十进制数字。...范围非常依赖于排序序列,可移植程序应避免依赖它们。

所有这些都向我表明,与 bash=~运算符一起使用的正则表达式应该尊重语言环境;但是我的测试似乎并没有证明这一点:

$ export LANG=en_US
$ export LC_COLLATE=en_US
$ [[ B =~ [A-M] ]] && echo matched || echo unmatched
matched
$ [[ b =~ [A-M] ]] && echo matched || echo unmatched
unmatched

我希望最后一个命令也会回matched显,因为整理序列与(ASCII)语言环境en_US中的序列aAbBcCdD...相反。ABCD...abcd...C

我是否错误地设置了我的语言环境?bash 是否没有为 POSIX 扩展正则表达式正确设置语言环境以使用语言环境?


基于马科斯的回答的更多实验:

en_US语言环境中,[a-M]显然匹配任何小写字符az和任何大写字符AM. 这将建议一个整理顺序abcd...ABCD...而不是aAbBcCdD.... 切换到C使用的语言环境[a-M]将导致2条件构造的退出代码,而不是0or 1。这表明一个无效的正则表达式,这是有道理的,因为C语言环境在整理顺序a之后。M

因此,在 POSIX 扩展正则表达式中肯定会使用语言环境。但是括号表达式不遵循我期望的整理顺序。括号表达式是否可能使用整理顺序以外的其他内容?


edit1:更新为使用实际正确的en_US整理顺序。
编辑2:添加了进一步的发现。

4

1 回答 1

2

它实际上是 aAbB... 而不是 AaBb。
试试这个:touch {a..z}; touch {A..Z}; ls -1 | sort
看?

所以

$ [[ a =~ [a-M] ]] && echo matched || echo unmatched
matched
$ [[ A =~ [a-M] ]] && echo matched || echo unmatched
matched
于 2017-08-16T14:39:07.867 回答