bash - bash 文件模式和区分大小写的范围

标签 bash shell

我在 bash 的文件模式中遇到了以下恕我直言的奇怪行为:

$ ls
Basic1  datei1  datie2  sdfl
$ ls [a-z]*
Basic1  datei1  datie2  sdfl
$ ls [abcdefghijklmnopqrstuvwxyz]*
datei1  datie2  sdfl

为什么范围为 [a-z] 的模式不区分大小写?错误或功能?

注意:

  1. bash-Option nocasegloboff(否则,上面给出的第二个模式也应该不区分大小写...):

    $ shopt nocaseglob
    nocaseglob  off
    
  2. 我的 bash 版本:

    $ bash --version
    GNU bash, Version 4.2.24(1)-release (i686-pc-linux-gnu)
    

GNU bash,版本 4.2.24(1)-release (i686-pc-linux-gnu)

最佳答案

如果您只想要以小写字母开头的文件名,请使用

ls [[:lower:]]*

编辑

回答 F. Hauri 的评论:section 3.5.8.1 of the reference manual说明了一切。但在我们阅读它之前,让我们玩一下 (YMMV):创建一个新的暂存目录并

$ # Create lots of cool files
$ touch {a..z} {A..Z}
$ ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
$ ls [a-b]
a A b
$ # Do you get it?
$ ls [a-B]
a A b B

所以它似乎 bash 的字母顺序(这里,在我的机器上,根据我的设置)是:

aAbBcCdDeE...

这也许可以解释为什么您会得到结果(看起来您的设置与我的相似)。

现在,去阅读 section 3.5.8.1 of the reference manual你会明白事情并不那么简单,排序取决于环境变量 LC_COLLATE 的值。

所以尝试:

$ LC_COLLATE=C
$ ls [a-b]
a b

是啊!

道德

如果您需要小写字母,请不要使用 [a-z],因为这在很大程度上取决于本地设置。相反,请使用 [[:lower:]]。在引用手册中,您还会找到其他几个有用的字符类。

底线

那么,错误或功能?您现在有了答案 ;-)

希望这对您有所帮助!

关于bash - bash 文件模式和区分大小写的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929984/

相关文章:

ruby - 使用 LaunchControl 运行时 bash 脚本中出现错误

linux - 用于多线程进程的 Shell 脚本

regex - 在 shell 中使用转义字符

python - 不能拆分,需要一个bytes-like对象,不是 'str'

linux - Bash 脚本 - 如何保持循环 'find' 命令直到找到文件?

c - 在用户创建的 Shell 中实现重定向工作不正常

基于用户选择的 Linux 变量

bash - 如何将列从一个文件附加到 bash 中的另一个文件?

bash - 如何完全像在Dockerfile中一样运行Docker cmds

python - 如何设置文件缓冲参数?