Content-type: text/html Manpage of GLOB

GLOB

Section: Linux Programmer's Manual (7)
Updated: 12 June 1998
Index Return to Main Contents
 

名称

glob - 形成路径名称

 

描述

在很久以前的 UNIX V6 版里, 用一个程序 /etc/glob 扩展通配符模式串. 不久以后它成为 shell 的内建功能.

现在还有类似的库函数 glob(3) 为用户程序实现同样的功能.

此规则遵循 (POSIX 1003.2, 3.13).

 

通配符匹配

包含 '?', '*' 或 '[' 字符的字符串称为通配符模式串. 形成路径名指 这样一种操作, 它把通配符模式串扩展为匹配该串的路径名列表. 匹配定义为:

不在方括弧中的 '?' 匹配任意单个字符.

不在方括弧中的 '*' 匹配任意字符串, 包括空串.

 

字符集

对于表达式 `[...]', 如果跟在开头的 '[' 符后面的第一个字符不是 '!', 则该表达式匹配某个单一字符, 一个方括弧内出现的任意字符. 方括弧内不能 有空串, 因此 ']' 可以作为第一个字符出现在方括弧内. (像这样,

 

范围集 (Ranges)

这里有一个特例: 用 '-' 分开的两个字符表达一个范围集. (像这样, `[A-Fa-f0-9]' 等于 `[ABCDEFabcdef0123456789]'.) 把 '-' 放到方括弧内的开头或最后可以获得它的实际意义. (像这样, `[]-]' 匹配两个字符, ']' 和 '-'中的一个. 而 `[--/]' 匹配三个字符, `-', `.' 和 `/'中的一个.)

 

补集 (Complementation)

表达式 '[!...]' 表示单个字符, 该字符不匹配方括弧内去掉开头 '!' 后 的表达式. (像这样, `[!]a-]' 匹配除了']', 'a'和'-'的任意单个字符.)

要去掉'?', '*'和'['的特殊含义, 可以通过前面加一个反斜杠; 或者在 shell 命令行中, 通过引号来引用这些字符. 在方括弧内这些字符显露出原意, 所以, '[[?*\]' 匹配这四个字符 中的一个: '[', '?', '*', '\'.

 

路径名 (PATHNAMES)

形成路径名功能应用于路径中的每一个成员部分. 路径中的'/'不能被通配符 语法错误.

如果要匹配的文件名以'.'开头, 那么这个'.'字符必须直接给出. (比如说, 用 'tar c .' 要更好.)

 

空列表 (EMPTY LISTS)

上面这个简单优雅的规则, 扩展通配符模式串成为匹配的路径名列表, 是最初的 UNIX 定义. 它允许扩展出空串, 例如


xv -wait 0 *.gif *.jpg
这里可能没有 *.gif 文件 (而且不算错误).

然而, POSIX 要求句法错误或路径名表为空时, 保留通配符模式串不变. (即不作扩展. 译注)

bash 中可以通过设置 allow_null_glob_expansion=true.

强置为传统的风格. (其他地方也有类似的问题, 例如, 老式的语句是

rm `find . -name "*~"`
新的写法为
rm -f nosuchfile `find . -name "*~"`
以避免由于空参数调用 rm 而产生错误信息.)

 

注意 (NOTES)

 

正则表达式 (Regular expressions)

注意, 通配符模式串不是正则表达式, 尽管它们有点象. 首先, 它匹配文件名, 而不是正文; 其次, 规则不一样, 例如正则表达式里的'*' 代表零个或多个前面内容的重复.

正则表达式中的方括弧表达式里, 取反操作是用'^'引导的, (而不是'[!...]', 译注). POSIX 声明, 在通配符模式串中, '[^...]'是未定义的.

 

字符集和国际化 (Character classes and Internationalization )

当然, 范围集最初指 ASCII 的范围, 因此 '[ -%]' 意思是 '[ !"#$%]',

一些UNIX实现把这个归纳为: 范围 X-Y 指 X 的编码到 Y 的编码之间的 编码字符. 可是, 这要求用户知道他们本地系统的字符编码, 此外, 如果 本地的字母表顺序和字符集顺序不对应, 那就更不方便了.

因此, POSIX对通配符模式串和正则表达式的方括弧表达法作了重大扩展, 上面我们知道了方括弧表达式法中的三个类型, 它们是 (i) 取补集 (ii) 直接列出的单个字符和 (iii) 范围集.

POSIX对范围集在国际化方面作了更有用的说明, 并且增加了三个类型:

(iii) 范围 X-Y 由 X 和 Y 之间的所有字符组成(包括X和Y), X和Y的当前编码序列 由当前场合的 LC_COLLATE 分类定义.

(iv) 命名字符集, 象

[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
因此可以用'[[:lower:]]'代替'[a-z]', 它在丹麦语里同样有效, 虽然丹麦 的字母表里'z'后面还有三个字母. 这些字符集由当前场合的 LC_CTYPE 分类定义.

(v) 符号对映, 象'[.ch.]' 或 '[.a-acute.]', 在'[.'和'.]'之间的字符串是定义在当前场合的对映元素. 注意这可以是多字符元素.

(vi) 等类表达式, 象'[=a=]', 在'[='和'=]'之间的字符串是任意等类中的对映元素, 它定义在当前场合. 例如, '[[=a=]]'可以等同于`[a徉溻]' (警告: 这里有 Latin-1 字符), 也就是 `[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'.

 

SEE ALSO

sh(1), glob(3), fnmatch(3), locale(7), regex(7)

 

中文版

[中文版维护人] Xuming [中文版最新更新] 2000/10/10
《中文MAN-PAGE计划》:http://www.cmpp.net/


 

Index

名称
描述
通配符匹配
字符集
范围集 (Ranges)
补集 (Complementation)
路径名 (PATHNAMES)
空列表 (EMPTY LISTS)
注意 (NOTES)
正则表达式 (Regular expressions)
字符集和国际化 (Character classes and Internationalization )
SEE ALSO
中文版

This document was created by man2html, using the manual pages.
Time: 14:43:05 GMT, April 08, 2001