GNU/Linux >> Tutoriales Linux >  >> Linux

¿Expansión y variables de Bash Brace?

Esta pregunta ya tiene respuestas aquí :¿Puedo usar variables dentro de la expansión {} sin `eval`?

(3 respuestas)
Cerrado hace 6 años.

Tengo un comando de búsqueda:

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

Quiero reemplazar a Alpha,Bravo,Charlie con $find_dir

find Directory/{$find_dir} arg1 arg2

sin embargo, este último se expande a

find Directory/{Alpha,Bravo,Charlie} arg1 arg2

más bien

find Directory/Alpha Directory/Bravo Directory/Charlie arg1 arg2

¿Por qué? Es parte de un script de bash bastante complejo que puede tener más o menos directorios, no todos los cuales son relevantes (por lo que no funcionaría subir/*). Entonces, si configuro tres ahora y agrego otro, tendré que agregarlo manualmente más tarde. Además, necesito que se ejecute desde la raíz de los directorios para mantener la perspectiva de los resultados encontrados (./Upload/Dir/file en lugar de ./Dir/file).

Pero usar una variable me permitiría cambiar eso según sea necesario y mantenerlo relevante para otras partes del script.

Respuesta aceptada:

Desde bash documentación, sección Brace Expansion:

La expansión Brace se realiza antes que cualquier otra expansión, y cualquier
carácter especial de otras expansiones se conserva en el resultado
. Es
estrictamente textual. Bash no aplica ninguna interpretación sintáctica
al contexto de la expansión o al texto entre llaves. Para
evitar conflictos con la expansión de parámetros, la cadena '${' no se considera
elegible para la expansión de llaves.

Otra nota, en bash :

El orden de las expansiones es:expansión de llaves, expansión de tilde,
parámetro, variable y expansión aritmética y sustitución de comandos (realizado de izquierda a derecha) , división de palabras y expansión de nombre de archivo
.

Entonces, en tu caso, bash vio expansión de llave antes de la expansión variable, hará la expansión de llave primero, producirá el resultado {Alpha,Bravo,Charlie} .

Si puedes controlar $find_dir contenido variable, puede usar eval :

eval "find Directory/{$find_dir} arg1 arg2"

Linux
  1. ¿Espacios para variables en Bash Script?

  2. ¿Es `~#` una expansión tilde de Bash?

  3. Variables “anidadas” en bash

  4. buscar y copiar archivos usando Bash

  5. Función Bash para encontrar el patrón de coincidencia de archivos más nuevo

Bash Scripting - Variables explicadas con ejemplos

Cómo encontrar la longitud de la cadena en Bash [Consejo rápido]

Comprender las variables en Bash Shell en Linux

bash buscar directorios

bash - encuentra la posición del índice de cadena de la subcadena

Salida detallada del comando Bash find