Quiero usar $var in
una expansión de llave de shell con un rango, en bash. Simplemente poner {$var1..$var2}
no funciona, así que fui "lateral" ...
Lo siguiente funciona, pero es un poco torpe.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
¿Hay una forma más "normal"?
shell
bash
brace-expansion
Peter.O
fuente
fuente
{$one..$three}
, porque no es una forma válida de llave de expansión, que en este caso espera enteros ... Sólo se convierte en una forma válida después de la expansión de $ var, queeval
luego pasa por el mismo proceso para generar una expansión normal de la secuencia de llaves ... 1 2 3 QED;) ... Resumen: la simple presencia de un par de llaves no activa la expansión de llaves ... solo una forma válida lo activa .a={0..9}; echo $a;
no hay extensión de llave . Usandoeval
, funciona. Así que creo que la explicación de @ mattdm es buena.Como usted ya se dio cuenta,
{1..3}
se expande a1 2 3
pero{foo..bar}
o{$foo..$bar}
no haga la expansión de llaves gatillo, y el último se amplió posteriormente para reemplazar$foo
y$bar
por sus valores.Una falla en GNU (por ejemplo, Linux no incorporado) es el
seq
comandoOtra posibilidad. si
foo.
no contiene caracteres especiales de shell, esLa solución más simple es usar zsh, donde
rm foo.{$ext0..$extN}
hace lo que quiere.fuente
Mientras que las otras respuestas tratan sobre el uso
eval
yseq
, enbash
, puede usar unfor
bucle de estilo C tradicional en un contexto aritmético. Las variablesext0
yextN
se expanden dentro de la((..))
causa de que el ciclo se ejecute para el rango definido.Si está buscando una manera óptima y evita múltiples
rm
comandos, puede usar un marcador de posición temporal para almacenar los resultados del nombre de archivo y llamarrm
de una sola vez.y ahora llame al
rm
comando en la matriz expandidafuente
Notas:
fuente