Accediendo al número/variable de iteración de expansión de llaves de bash

Accediendo al número/variable de iteración de expansión de llaves de bash

Pregunta:

¿Es posible acceder a qué número de iteración de bash se está procesando actualmente?

Psuedo-comando

mv {1..5}.something.{1..5} $x1.$x2.something
  • Nota: Esta es una representación lógica; una muestra que no funciona.

Pseudo-salida

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
  • Donde n y m son ambas la iteración de su respectiva expansión de llaves.

Explicación

Estoy familiarizado con bucles como:

for x in {1..10}; do echo -n "$x "; done

Como puede ver, bash está configurando la iteración en $x. Deseo saber si es posible y cómo acceder a la variable que usa bash cuando no estoy definiendo qué variable usar. Cuando a bash se le da unexpansión de corsésin una variable sobre la que iterar, debe hacerlo [internamente] de alguna manera. Espero que se pueda acceder a esta variable en tiempo de ejecución del script.

Gracias a toda la gente de#intento

Respuesta1

No entiendes bien cómo funciona la expansión de aparatos ortopédicos. Vuelva a leer el comentario anterior de Dennis Williamson.

Estás pensando que cuando escribo mv foo.{1,2,3} bar, el shell en realidad está invocando el comando varias veces, como si hubieras escrito:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

Si eso fuera cierto, entonces su pregunta tendría sentido: el Shell ejecuta múltiples comandos y, por lo tanto, debe mantener una lista.

Pero eso no es lo que está pasando. La expansión de la llave se expandeun solo argumentoluego invoca la línea de comando resultanteuna vez. Entonces, para el ejemplo anterior, el shell ve que el argumento foo.{1,2,3}contiene expansión de llaves y expande ese argumento en tres argumentos foo.1 foo.2 foo.3. Luego inserta esa expansión en la línea de comando en lugar del argumento entre llaves y luego continúa analizando la línea de comando. Cuando termina, el shell ejecuta un comando, que se vería así:

mv foo.1 foo.2 foo.3 bar

Entonces, sí, probablemente cuando el shell expande ese argumento entre llaves mantiene una lista, pero no hay forma de acceder a esa lista en la expansión de otros argumentos porque la expansión entre llaves está completamente completa y toda la información sobre la expansión se agota y se olvida. el momento en que se analizan los demás argumentos.

De todos modos, la única forma en que tal argumento sería útil sería si el shell ejecuta varios comandos, lo cual no es así. Para ejecutar múltiples comandos debes usar un bucle real; la expansión de llaves no hará eso.

En cuanto a $_, es una construcción de Perl que se puede usar en lugar de una variable de bucle (como xen su ejemplo de bucle), por lo que no es realmente relevante para la expansión de llaves.

Respuesta2

Específicamente mv, puede simplemente usar la -vbandera para ver qué se está procesando actualmente. Como señaló @DennisWilliamson, no se establece ninguna variable para la secuencia expandida entre llaves: escribir echo {1..5}es equivalente a escribir echo 1 2 3 4 5. Comparar con echo "$foo": no hay forma de saber después del hecho qué variable se echoeditó.

Respuesta3

¿Por qué no utiliza su propia variable para contar el número de iteración y repetirla? Si desea ver qué sucede en la ejecución, ejecútelo con la opción -x. Al igual que bash -x te dirá en qué parte del ejemplo. Pero sin especificar lo que se intenta lograr, es difícil ayudar.

información relacionada