Cómo utilizar Brace Expansion en Bash Shell de Linux

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 del caparazón de Bash ejecuta 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 abrazadera está disponible en las carcasas modernas, pero es posible 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:

#!/bin/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 «". «

Anuncio publicitario

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 de la terminal. Tenga en cuenta que las comas se ignoran.

echo {one,two,three,four}

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.

echo (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.

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

echo {1..10}

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

En relación :  Cómo obtener el skin Fortnite Shang-Chi en la temporada 7: New Marvel Crossover
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 señalamos anteriormente, un rango tiene un comienzo y un final personaje. 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.

for i in {3..7}
do
   echo $i
done
Anuncio publicitario

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

for i in {m..q}
do
   echo $i
done

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.

for i in {3..7}; do echo $i; done

for i in {m..q}; do echo $i; done

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.

Este comando usa un preámbulo.

echo chapter{1..3}

Este ejemplo usa una posdata:

echo {contents,paper,bilbiography}.md

Y este comando usa ambos.

echo chapter-{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. Hemos estado usando echo como 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:

touch file-{1..4}.txt
ls *.txt

Anuncio publicitario

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».

En relación :  Silenciar su PC: cómo cazar y eliminar zumbidos, zumbidos y cascabeles

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.

zip source-code program{.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 brace/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.

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 diff programa para ver las diferencias entre las dos versiones de «prog-1.c.»

diff brace/{new,old}/prog-1.c

Anuncio publicitario

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. los mkdir -p opción (padre) crea los directorios principales que faltan cuando se crea un directorio secundario.

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

Puede utilizar la expansión de corsé con wget para 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 picture*.*

Abraza la abrazadera

15 personajes especiales que debes conocer para Bash

RELACIONADO15 personajes especiales que debes conocer para Bash

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.