Table of Contents

Bash - Brace Expansion {} (Data Generation)

About

Brace expansion is a mechanism by which arbitrary strings may be generated.

This mechanism is similar to pathname expansion, but the filenames generated need not exist.

Syntax

Patterns to be brace expanded take the form of an optional preamble, followed by either:

followed by an optional postscript.

The preamble is prefixed to each string contained within the braces, and the postscript is then appended to each resulting string, expanding left to right.

Series of comma-separated strings

echo 'Hello '{Foo,Bar}$' !\n'
Hello Foo !
Hello Bar !

Usage / Example

This construct is typically used as shorthand when the common prefix of the strings to be generated is longer than in the above example:

Example:

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

Resulting in

mkdir /usr/local/src/bash/old /usr/local/src/bash/new /usr/local/src/bash/dist /usr/local/src/bash/bugs

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

Resulting in:

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

Sequence Expression

Bash - Sequence

Management

Order

Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual. Bash does not apply any syntactic interpretation to the context of the expansion or the text between the braces.

Nested

Brace expansions may be nested. The results of each expanded string are not sorted; left to right order is preserved. For example,

echo a{d,c,b}e

expands into:

ade ace abe

Sh

Brace expansion introduces a slight incompatibility with historical versions of sh. sh does not treat opening or closing braces specially when they appear as part of a word, and preserves them in the output.

Bash removes braces from words as a consequence of brace expansion.

For example, a word entered to sh as file{1,2} appears:

If strict compatibility with sh is desired: