Un script bash que contiene
for i in {a,b}-{1,2}; do
echo $i;
done
huellas dactilares
a-1
a-2
b-1
b-2
cuando se ejecuta Esto es lo que esperaba, ya que la {a,b}
construcción se expande.
Sin embargo, cuando (otro) script contiene
v={a,b}-{1,2}
echo $v
se imprime
{a,b}-{1,2}
que no es lo que esperaba Esperaba que se imprimiera a-1 a-2 b-1 b-2
. Obviamente, la {a,b}
construcción no se expande.
Puedo hacer que se expanda así
v=$(echo {a,b}-{1,2})
En base a estas observaciones tengo dos preguntas: 1) ¿cuándo se {a,b}
expande el constructo? 2) ¿es $(echo {a,b}-{1,2})
la forma preferida de desencadenar una expansión cuando sea necesario?
bash
brace-expansion
René Nyffenegger
fuente
fuente
=
. Por ejemplo,v=a-1 a-2
no funcionará.v=a-1 a-2
significaassign 'a-1' to variable v and run 'a-2'
v=(a-1 a-2)
asigna la matriz a la variablev
.v+=(b-1 b-2)
se le suma.Respuestas:
El manual de Bash dice que:
La expansión de llaves no está en la lista, por lo que no se realiza para la tarea
v={a,b}-{1,2}
. Como mencionó @Wildcard, la simple expansión a nov=a-1 v=b-1 ...
tendría sentido de todos modos.Además, al ejecutar el
echo $v
, se aplica lo siguiente:La expansión de llaves ocurre antes de la expansión variable, por lo que las llaves asignadas a
$v
no se expanden.Pero puedes hacer cosas como esta:
Expandirlo
$(echo ...)
debería funcionar si no tiene ningún espacio en blanco en la cadena para expandir, y por lo tanto no tendrá problemas con la división de palabras. Una mejor manera podría ser usar una variable de matriz si puede.Por ejemplo, guarde la expansión en una matriz y ejecute algún comando con los valores expandidos:
fuente
Un punto interesante Posiblemente útil es el siguiente extracto de
man bash
:Tenga en cuenta que la expansión de llaves NO se menciona en la lista.
Sin embargo, esto todavía deja una pregunta, a saber: ¿Cómo sabe el shell que se trata de una asignación variable y, por lo tanto, no está sujeta a la expansión de llaves? O más precisamente, ¿dónde se clarifica y codifica la secuencia de análisis de manera que el shell se defina para identificar asignaciones variables antes de que maneje la expansión de llaves? (Obviamente, así es como
bash
funciona, pero no he encontrado la línea exacta de documentación que describe esto).fuente
LESS=+/SIMPLE man bash
).según mi pequeño conocimiento, {a, b, c} se expande cuando se repite directamente o se usa con un comando, por ejemplo: mkdir ~ / {a, b, c}, pero cuando se establece en una variable, debe evaluarse antes haciéndolo eco o usándolo como argumento!
como tiene "a" seguido de "b" en orden alfabético [az] y "1" seguido de "2" en orden dec [0-9]: puede usar el punto doble ".." en lugar de coma ", "
fuente
v
no se configuró en la cadena literal "a-1 a-2 b-1 b-2". O, al menos, por qué no se produjo ningún error al escribir el comando:v=a-1 v=a-2 v=b-1 v=b-2
(que esperaría que se ampliara esa asignación de variable). Es una buena pregunta; Esto realmente no responde.Asignar a una variable en bash no expande la expresión.
Para este pequeño script, x contendrá
"*"
y no la expansión de"*"
:Sin embargo, algunos valores se expanden, ref. la buena respuesta de ilkkachu.
Las expresiones se expanden cuando se evalúan.
Me gusta esto:
O así:
O así:
La activación
$()
es bastante común y creo que es preferibleeval
, pero lo mejor es probablemente no activar la evaluación en absoluto, hasta que la variable se use realmente en un comando.fuente