its*_*_me 5 command-line shell bash wildcards
Linux 命令行(书籍 - 页数 47)说:
...您必须对它们 [字符范围] 非常小心,因为除非正确配置,否则它们不会产生预期的结果。现在,您应该避免使用它们并改用字符类。
这本书没有给出任何理由,除此之外。
问题- 1:那么,到底为什么要字符类(如[:alnum:],[:alpha:],[:digit:],等)优先于字符范围(如[a-z],[A-Z],[0-9],等)?
问题- 2:确实[:alpha:]代表[a-z],[A-Z]和上和其他语言的小写字母太?同样,是否也[:digit:]包括来自其他语言的数字?如果它们匹配,那就是。
(我知道有两个问题,但在这种情况下,它们几乎是相互关联的,IMO。)
根据bash联机帮助页,LC_COLLATE环境变量影响字符范围,完全按照 Hauke Laging 的答案:
\n\nLC_COLLATE \n此变量确定对路径名扩展结果进行排序时使用的排序规则,并确定路径名扩展和模式匹配中\n范围表达式、等价类和排序序列的行为。
\n
另一方面,LC_CTYPE影响字符类别:
\n\nLC_CTYPE此变量确定路径名扩展和模式匹配中字符的解释以及字符类的行为。
\n
这意味着,如果您在英语、从左到右、拉丁字母、阿拉伯数字的环境中思考,这两种情况都可能存在问题。
\n如果您确实正确,并且/或者正在为多语言环境编写脚本,那么最好确保您在匹配文件时知道您的语言环境变量是什么,或者确保您\正在以完全通用的方式编码。
\n不过,除非您学过语言学,否则很难预见某些情况。
\n但是,我不知道使用拉丁语的语言环境会改变字母的顺序,所以 [az] 可以工作。拉丁字母有一些扩展,可以以不同的方式整理连字和变音符号。然而,这里有一个小实验:
\nmkdir /tmp/test\ncd /tmp/test\nexport LC_CTYPE=de_DE.UTF-8\nexport LC_COLLATE=de_DE.UTF-8\ntouch Gr\xc3\xbc\xc3\x9fen\nls G* # This says \xe2\x80\x98Gr\xc3\xbc\xc3\x9fen\xe2\x80\x99\nls *[a-z]en # This says nothing!\nls *[a-z\xc3\x9f]en # This says \xe2\x80\x98Gr\xc3\xbc\xc3\x9fen\xe2\x80\x99\nls Gr[a-z]*en # This says nothing!\nRun Code Online (Sandbox Code Playgroud)\n这很有趣:至少对于德语来说,像 \xc3\xbc 这样的变音符号和像 \xc3\x9f 这样的连字都不会折叠成拉丁字符。(要么那样,要么我搞砸了区域设置更改!)
\n当然,这可能对您不利,如果您尝试查找以字母开头的文件名,请使用[a-z]*并将其应用于以 \xe2\x80\x98\xc3\x84\xe2\x80\ 开头的文件x99。