Expansión de llaves
La expansión de llaves es un mecanismo por el cual se pueden generar cadenas arbitrarias.
Los patrones para la expansión de llaves tienen la forma de un preámbulo opcional, seguido y encerrado entre llaves de, o bien una secuencia de cadenas separadas por comas, o bien de expresiones de rango, y acaba con un epílogo opcional. El preámbulo y el epílogo estarán en todas las cadenas resultantes al principio y al final de cada una de ellas respectivamente.
Dentro de unas mismas llaves no pueden mezclarse secuencias y rangos, o bien una cosa o la otra. En el ejemplo siguiente, se especifica una secuencia con preámbulo (prefijo) y epílogo (sufijo).
$ echo x{aa,bb,cc}y
xaay xbby xccy
Una expresión de rango tiene la forma {x..y[..incr]}, donde x e y son enteros o caracteres únicos, e incr es un incremento/decremento opcional, dado como un valor entero. Cuando se suministran enteros, la expresión se expande por cada número entre x e y, ambos inclusive. Los enteros suministrados pueden ir precedidos de '0' para forzar a que cada término tenga la misma longitud añadiéndose ceros por la izquierda. Cuando se suministran caracteres, la expresión se expande por cada carácter entre x e y según la tabla de códigos ASCII, ambos inclusive. No se puede olvidar que tanto x como y deben ser del mismo tipo. Cuando se utiliza el incremento, este se usa como la diferencia entre cada uno de los términos. El incremento por defecto es 1. Del incremento se usa su valor absoluto, no importa que sea positivo o negativo, si x es mayor que y los valores siempre irán decreciendo, independientemente de que el incremento sea positivo o negativo, y si x es menor que y los valores siempre irán creciendo.
Algunos ejemplos para entender mejor lo dicho anteriormente:
$ echo x{0..16}y
x0y x1y x2y x3y x4y x5y x6y x7y x8y x9y x10y x11y x12y x13y x14y x15y x16y
$ echo x{00..16}y
x00y x01y x02y x03y x04y x05y x06y x07y x08y x09y x10y x11y x12y x13y x14y x15y x16y
$ echo x{00..16..2}y
x00y x02y x04y x06y x08y x10y x12y x14y x16y
$ echo x{00..16..2}y
x16y x14y x12y x10y x08y x06y x04y x02y x00y
$ echo x{a..p..2}y
xay xcy xey xgy xiy xky xmy xoy
$ echo {aa,pp,ff}{1..3}
aa1 aa2 aa3 pp1 pp2 pp3 ff1 ff2 ff3
$ echo mkdir /home/{juan,jose,pablo}/{bin,tmp}
mkdir /home/juan/bin /home/juan/tmp /home/jose/bin /home/jose/tmp /home/pablo/bin /home/pablo/tmp
$ echo mkdir /home/{juan,jose/{bin,tmp},pablo}
mkdir /home/juan /home/jose/bin /home/jose/tmp /home/pablo
En el caso de que en una secuencia de cadenas, una de ellas lleve uno o varios espacios, esta debe entrecomillarse.
$ echo rm -r \'/home/usuario/{'Mis documentos','Mis fotos'}\'
rm -r '/home/usuario/Mis documentos' '/home/usuario/Mis fotos'
La expansión de llaves se realiza antes de cualquier otra expansión, y cualquier carácter especial para otras expansiones se mantiene en el resultado.
Una expansión de llaves formada correctamente debe contener las llaves de apertura y de cierre sin entrecomillar. Cualquier expansión de llaves formada incorrectamente permanecerá sin cambios, se trataría como una cadena literal.
Licencia: licencia de software libre GPL