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 x
en 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 -v
bandera 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 echo
editó.
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.