2011-01-25 24 views
4

我正在为我的周末作业实现一个linux shell,并且在实现wilcard匹配作为shell中的一项功能时遇到了一些问题。众所周知,贝壳本身就是一种完整的语言,例如bash,ksh等。我不需要实现像控制结构,作业等完整功能。但是如何实现*在shell原型中实现globbing

快速分析为您提供了以下结果:

echo * 

列出了所有当前目录下的文件。这是shell的唯一逻辑表现形式吗?我的意思是,不考虑bash的语言特定功能,这是一个shell在内部执行的操作吗?将*替换为当前目录中与该模式匹配的所有文件?

另外我听说过Perl兼容正则表达式,但它似乎很复杂,使用第三方库。

任何建议,链接等?我也会尝试查看源代码,以查找bash。

+0

这些都不是正则表达式,而是通配符。例如。 `*`不是有效的正则表达式,因为`*`是*限定符*。同样在此被称为[通配符](http://en.wikipedia.org/wiki/Glob_(编程))(模式匹配的一种形式)。 – Joey 2011-01-25 12:11:50

+0

“通配符”。番茄tometoes,这就是我的意思,通配符。 – aasthetic 2011-01-28 16:36:47

回答

2

是的,那是壳做什么。它将用cwd中的所有文件和文件夹名称替换'*'个字符。它实际上是非常基本的正则表达式,仅支持'?''*',并与cwd中的文件和文件夹名称匹配。 注意在简单或双引号之间加上\*'*''"不会被替换(反斜杠和引号在传递到执行的命令之前被删除)。

+0

这就是所谓的通配。这不是一种正则表达式。 – 2011-01-25 20:38:17

3

这就是所谓的“通配”的功能执行这一被命名为相同:glob(3)

1

如果你想要更多的控制比glob给出的标准功能fnmatch执行只是水珠匹配。

请注意,shell还执行字扩展(例如"~""/home/user"),如果您正在手动执行文件名匹配,则应在glob扩展之前完成该扩展。 (或者使用wordexp。)