Cartesian products in Bash

Here’s a handy thing you can do in Bash: calculate the Cartesian product of two sets.

E.g.

echo {A,B,C}{A,B,C}

gives

AA AB AC BA BB BC CA CB CC

i.e. it’s every possible permutation of two elements from the two sets.

A --- A
  \ /
B -x- B
  / \
C --- C

(Thanks to Bill Hails for the diagram!)

This can be a useful tool for quickly figuring things out in various situations. For example, I wanted to write some tests for a feature that allowed users to set two configuration options to one of three values. Bash made it easy to list out the possible permutations I needed to cover in the tests.

You can control the number of elements in each permutation by the number of lists you give to Bash:

echo {A,B}{A,B}{A,B}
AAA AAB ABA ABB BAA BAB BBA BBB

Or use different sized lists that may or may not share elements:

echo {A,B}{A,B,C,D,E}
AA AB AC AD AE BA BB BC BD BE
echo {1,2}{A,B,C,D,E}
1A 1B 1C 1D 1E 2A 2B 2C 2D 2E

Bash also provides a nice syntax for making a list from a range, which works with numbers or letters:

echo {A..C}{A..D}
AA AB AC AD BA BB BC BD CA CB CC CD
echo {1..5}{A..C}
1A 1B 1C 2A 2B 2C 3A 3B 3C 4A 4B 4C 5A 5B 5C

It’s useful to have this helper immediately available on a terminal.


Tech mentioned