Brace Expansion

Brace expansion 是一种可能产生任意字符串的机制。这种机制类似于 pathname expansion, 但是并不需要存在相应的文件。 花括号扩展的模式是一个可选的 preamble(前导字符), 后面跟着一系列逗号分隔的字符串,包含在一对花括号中, 再后面是一个可选的 postscript(附言)。 前导被添加到花括号中的每个字符串前面,附言被附加到每个结果字符串之后, 从左到右进行扩展。

花括号扩展可以嵌套。扩展字符串的结果没有排序;而是保留了从左到右的顺序。 例如, a{d,c,b}e 扩展为 `ade ace abe'。

花括号扩展是在任何其他扩展之前进行的,任何对其他扩展有特殊意义的字符 都保留在结果中。它是严格字面上的。 Bash 不会对扩展的上下文或花括号中的文本做任何语义上的解释。

正确的花括号扩展必须包含没有引用的左括号和右括号,以及至少一个没有 引用的逗号。任何不正确的表达式都不会被改变。可以用反斜杠来引用 {, 来阻止将它们识别为花括号表达式的一部分。 为了避免与参数扩展冲突,字符串 ${ 不被认为有效的组合。

这种结构通常用来简写字符串的公共前缀远比上例中为长的情况,例如:

mkdir /usr/local/src/bash/{old,new,dist,bugs}

或者:

chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

花括号扩展导致了与历史版本的 sh 的一点不兼容。在左括号或右括号作为词的一部分出现时, sh 不会对它们进行特殊处理,会在输出中保留它们。 Bash 将括号从花括号扩展结果的词中删除。例如,向 sh 输入 file{1,2} 会导致不变的输出。同样的输入在 bash 进行扩展之后,会输出 file1 file2 . 如果需要同 sh 严格地保持兼容,需要在启动 bash 的时候使用 +B 选项,或者使用 set 命令加上 +B 选项来禁用花括号扩展 (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 章节)。