mtb*_*bno 6 shell bash wildcards
我正在使用ls实用程序,我的命令如下所示:
$ ls x?[a-c]*
Run Code Online (Sandbox Code Playgroud)
这样的命令的输出是什么?到目前为止,我明白(我希望它是正确的)它将列出以下项目:
我的问题是,什么是?(问号)代表?它是什么条件?
先感谢您。
Ark*_*zyk 11
它不是一个ls特性,它是一个bash特性,它在bash(1)的“模式匹配”部分中有描述:
特殊模式字符的含义如下:
*
匹配任何字符串,包括空字符串。当
globstar壳选项被启用,并且*在一个路径名扩展上下文中使用,两个相邻的*用作单个条纹S将匹配的所有文件和零个或多个目录和子目录。如果后跟 a/,则两个相邻的*s 将仅匹配目录和子目录。?
匹配任何单个字符。
[...]
匹配任何一个封闭的字符。由连字符分隔的一对字符表示范围表达式;使用当前语言环境的整理序列和字符集,位于这两个字符之间的任何字符(包括这两个字符)都将匹配。如果 后面的第一个字符
[是 a!或 a,^则匹配任何未包含的字符。范围表达式中字符的排序顺序由当前语言环境和LC_COLLATE或LC_ALLshell 变量(如果已设置)的值确定。要获得范围表达式的传统解释,其中[a-d]等价于[abcd], 将LC_ALLshell 变量的值设置 为C, 或启用globasciirangesshell 选项。-可以通过将A作为集合中的第一个或最后一个字符来匹配它。A]可以通过将它作为集合中的第一个字符来匹配。
你的理解也是不完全正确的-?是指任何单个字符,所以表达式x?[a-c]*会匹配xQcFoo.bar,xmabc并且x1a也是xabc-问题是,{a,b,c}可能还有第二封信,不仅第三。ls x?[a-c]*命令的输出将是匹配x?[a-c]*模式的文件列表
。或者,如果没有这样的文件,shell 不会x?[a-c]*用任何东西替换,所以ls会尝试列出字面上命名为x?[a-c]*.