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]
显然匹配任何小写字符a
到z
和任何大写字符A
到M
. 这将建议一个整理顺序abcd...ABCD...
而不是aAbBcCdD...
. 切换到C
使用的语言环境[a-M]
将导致2
条件构造的退出代码,而不是0
or 1
。这表明一个无效的正则表达式,这是有道理的,因为C
语言环境在整理顺序a
之后。M
因此,在 POSIX 扩展正则表达式中肯定会使用语言环境。但是括号表达式不遵循我期望的整理顺序。括号表达式是否可能使用整理顺序以外的其他内容?
edit1:更新为使用实际正确的en_US
整理顺序。
编辑2:添加了进一步的发现。