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