Pathname Expansion

词的拆分之后,除非设置过 -f 选项, bash 搜索每个词,寻找字符 *, ?, 和 [. 如果找到了其中之一,那么这个词被当作一个 pattern(模式), 被替换为匹配这个模式的文件名以字母顺序排列的列表。如果没有找到匹配的文件名, 并且 shell 禁用了 nullglob 选项,这个词将不发生变化。如果设置了 nullglob 选项并且没有找到匹配,这个词将被删除。如果启用了 nocaseglob 选项,匹配时将不考虑字母的大小写。当模式用作路径名扩展时,字符 ``.'' 如果在一个名称的开始或者紧随一个斜杠之后,那么它必须被显式地匹配,除非设置了 dotglob shell 选项。当匹配一个路径名时,斜杠符必须被显式地匹配。其他情况下,字符 ``.'' 不会被特殊对待。参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 中对 shopt 的介绍,其中有 shell 选项 nocaseglob, nullglob, 和 dotglob 的描述。

环境变量 GLOBIGNORE 可以用来限制匹配 pattern 的文件名集合。如果设置了 GLOBIGNORE, 每个匹配的文件名如果匹配 GLOBIGNORE 中任何一个模式的话将从匹配的列表中删除。文件名 ``.''``..'' 总是被忽略,即使设置了 GLOBIGNORE。 但是,设置 GLOBIGNORE 和启用 shell 选项 dotglob 效果是相同的,因此所有其他以 ``.'' 开头的文件名将被匹配。要得到原来的行为 (忽略所有以 ``.'' 开头的文件名),可以将 ``.*'' 添加为 GLOBIGNORE 的模式之一。选项 dotglob 被禁用,如果 GLOBIGNORE 没有定义时。

Pattern Matching

任何模式中出现的字符,除了下面描述的特殊模式字符外,都匹配它本身。 模式中不能出现 NUL 字符。如果要匹配字面上的特殊模式字符,它必须被引用。

特殊模式字符有下述意义:


匹配任何字符串包含空串。

?

匹配任何单个字符。

[...]

匹配所包含的任何字符之一。用一个连字符 (`-') 分隔的一对字符意思是一个 range expression (范围表达式); 任何排在它们之间的字符,包含它们,都被匹配。 排序使用当前语言环境的字符顺序和字符集。如果 [ 之后的第一个字符是一个 ! 或是一个 ^ 那么任何不包含在内的字符将被匹配。范围表达式中字符的顺序是由当前语言环境 和环境变量 LC_COLLATE 的值 (如果设置了的话) 决定的。一个 - 只有作为集合中第一个或最后一个字符时才能被匹配。一个 ] 只有是集合中第一个字符时才能被匹配。

[] 中,character classes (字符类) 可以用 [:class:] 这样的语法来指定,这里 class 是在 POSIX.2 标准中定义的下列类名之一:

alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit 一个字符类匹配任何属于这一类的字符。word 字符类匹配字母,数字和字符 _。

[] 中,可以用 [=c=] 这样的语法来指定 equivalence class (等价类)。它匹配与字符 c 有相同归并权值 (collation weight,由当前 语言环境定义) 的字符。

[] 中,语法 [.symbol.] 匹配归并符号 (collating symbol) symbol

如果使用内建命令 shopt 启用了 shell 选项 extglob, 将识别另外几种模式匹配操作符。下面的描述中,pattern-list 是一个 或多个模式以 | 分隔的列表。复合的模式可以使用一个或多个下列的 子模式构造出来:

?(pattern-list)

匹配所给模式零次或一次出现

*(pattern-list)

匹配所给模式零次或多次出现

+(pattern-list)

匹配所给模式一次或多次出现

@(pattern-list)

准确匹配所给模式之一

!(pattern-list)

任何除了匹配所给模式之一的字串