Cómo utilizar Brace Expansion en Bash Shell de Linux

Una ventana de terminal en un sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

La expansión de llaves es una técnica útil para generar listas de cadenas que se pueden usar en scripts y alias y en la línea de comandos de Linux. Ahorre tiempo y evite errores escribiendo menos.

Expansión de la abrazadera

Antes de que el shell Bash ejecute un comando en una ventana de terminal o una línea en un script, verifica si necesita realizar alguna sustitución en el comando. Los nombres de las variables se reemplazan por sus valores, los alias se reemplazan por los comandos para los que son abreviados y se realiza cualquier expansión. La expansión de llaves es una forma de expansión respaldada por Bash.

La expansión de abrazaderas está disponible en las carcasas modernas, pero puede que falte en algunas carcasas antiguas. Si va a utilizar la expansión de llaves en los scripts, asegúrese de invocar un shell que admita la expansión de llaves, como Bash:

Usaremos Bash para nuestros ejemplos.

La generación de listas de cadenas puede parecer más una novedad que un beneficio, pero ofrece algunas funciones que pueden ahorrar tiempo y pulsaciones de teclas. A menudo, puede proporcionar una solución simple y elegante a un problema o requisito.

Expansiones simples

Una expansión de llaves está contenida entre un par de llaves «{}». Puede ser una lista de elementos separados por comas o un especificador de rango. No se permiten espacios dentro de las llaves a menos que haya envuelto la cadena entre comillas » "

Para una lista separada por comas, el proceso de expansión toma cada elemento por turno y lo pasa al comando de llamada. En este ejemplo, es echo que simplemente los imprime en la ventana del terminal . Tenga en cuenta que las comas se ignoran.

echo {uno, dos, tres, cuatro}

Una lista puede estar formada por palabras o dígitos.

echo {1,2,3,4}

El orden de los elementos de la lista es completamente arbitrario.

eco (4,2,3,1)

Un rango de expansión tiene un carácter inicial y final conectado con dos puntos ” ..” sin ningún espacio en blanco. La expansión proporciona automáticamente todos los elementos de la lista que faltan, de modo que se crea todo el rango desde el carácter inicial hasta el final.

Relacionado:  Cómo encontrar el número de modelo de su iPhone o iPad

Esto imprimirá los dígitos del 1 al 10.

echo {1..10}

La numeración es arbitraria. No tiene por qué empezar en uno.

echo {3..12}

Los rangos se pueden especificar para que se ejecuten hacia atrás. Esto generará una lista de cinco a uno.

echo {5..1}

Los rangos pueden incluir números negativos.

echo {4 ..- 4}

Como hemos señalado anteriormente, una gama tiene un comienzo y un fin de carácter . No tiene por qué ser un número. Puede ser una carta.

echo {q..v}

Las letras también pueden ir al revés.

echo {f..a}

Uso de la expansión de corsé con bucles

Puede utilizar la expansión de llaves con rangos en bucles en scripts.

para yo en {3..7}
hacer
   echo $ i
hecho

Los rangos de expansión de llaves le permiten usar caracteres como variable de bucle.

porque yo en {m..q}
hacer
   echo $ i
hecho

Los bucles generalmente se usan en scripts, pero no hay nada que le impida escribirlos en la línea de comando para ver qué sucede.

para i en {3..7}; echo $ i; hecho

para i en {m..q}; echo $ i; hecho

Concatenación y anidación

Dos expansiones adyacentes no actúan de forma independiente una tras otra. Interoperan. Cada elemento en la primera expansión es actuado por cada elemento en la segunda expansión.

echo {q..v} {1..3}

Las expansiones también se pueden anidar. Una expansión anidada actuará sobre el elemento inmediatamente anterior.

echo {part-1, part-2 {a, b, c, d}, part-3}

También puede anidar expansiones creando una lista delimitada por comas de expansiones de rango.

echo {{5..0}, {1..5}}

Preámbulo y posdata

Puede colocar texto antes y después de una expansión de llaves para que ese texto se incluya en los resultados de la expansión. El texto colocado delante de una expansión se llama preámbulo, mientras que el texto colocado detrás de una expansión de llaves se llama posdata.

Relacionado:  ¿Qué es el Hyperthreading?

Este comando usa un preámbulo.

capítulo de eco {1..3}

Este ejemplo usa una posdata:

echo {contenido, papel, bilbiografía} .md

Y este comando usa ambos.

echo capítulo- {1..4} .md

Ampliación de directorios y nombres de archivos

Como probablemente ya habrá adivinado, uno de los usos principales de las expansiones de llaves es crear nombres de archivos y directorios que se pueden pasar a otros comandos. Lo hemos estado usando echocomo una forma conveniente de ver exactamente qué sucede cuando se activa una expansión. Puede sustituir cualquier comando que tome nombres de archivos o directorios como entrada y usar la expansión de llaves con él.

Para crear rápidamente algunos archivos , use touch:

toque archivo- {1..4} .txt
ls * .txt

Si tiene muchos archivos con el mismo nombre base pero diferentes extensiones de archivo y desea realizar una operación en un subconjunto de ellos, las expansiones de llaves pueden ayudar. Aquí, estamos comprimiendo un subconjunto de archivos que tienen «programa» como nombre de base en un archivo ZIP llamado «código-fuente.zip».

Los directorios de desarrollo contienen muchos archivos que tendrán el mismo nombre de base que su programa principal. Por lo general, no desea realizar copias de seguridad ni distribuir archivos como archivos de objeto «.o». Esta es una forma sencilla de incluir solo los tipos de archivos de interés.

programa de código fuente zip {.c, .h, .css}

Este comando hará una copia de un archivo y le agregará «.bak», haciendo una copia de seguridad del archivo original. Un punto interesante a tener en cuenta es que la expansión de llaves contiene una lista separada por comas, pero el primer elemento está vacío. Si no hubiéramos incluido la coma, la expansión no habría tenido lugar.

cp brace / new / prog-1.c {,. bak}
ls corsé / new / prog-1.c.bak

Para realizar alguna acción en dos archivos en directorios diferentes, podemos usar una expansión de llaves en la ruta a los archivos.

Relacionado:  El nuevo iPhone SE de Apple es tan rápido como un iPhone 13

En este ejemplo, el directorio «brace» contiene dos subdirectorios, uno llamado «nuevo» y otro llamado «antiguo». Contienen diferentes versiones del mismo conjunto de archivos de código fuente. Usaremos el diffprograma para ver las diferencias entre las dos versiones de «prog-1.c».

diff brace / {nuevo, antiguo} /prog-1.c

Si tiene un esqueleto estándar de directorios que necesita crear al comienzo de un proyecto, puede crearlos rápidamente usando la expansión de llaves. La  mkdir -popción (principal) crea los directorios principales que faltan cuando se crea un directorio secundario.

mkdir -p {source, build, man, help {/ pages, / yelp, / images}}
árbol

Puede utilizar la expansión de llaves con  wgetpara descargar varios archivos .

En este comando, vamos a descargar archivos de dos directorios, llamados «test1» y «test2». Cada directorio contiene dos archivos llamados «imagen1» e «imagen2».

wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg

Enumerar los archivos muestra los archivos que se recuperaron y cómo wget cambia el nombre de los archivos para evitar conflictos de nombres con los archivos existentes.

ls foto *. *

Abraza la abrazadera

Parece que la expansión de llaves es otro de los secretos mejor guardados de Linux . Mucha gente me dice que nunca ha oído hablar de la expansión de llaves, mientras que otros me informan que es uno de sus trucos favoritos de línea de comandos.

Pruébelo y podría encontrar su camino en su conjunto de trucos de línea de comandos.