Eu quero usar $var in
uma expansão de chave de concha com um intervalo, no bash. Simplesmente colocar {$var1..$var2}
não funciona, então fui "lateral" ...
O seguinte funciona, mas é um pouco desagradável.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Existe uma maneira mais "normal"?
shell
bash
brace-expansion
Peter.O
fonte
fonte
{$one..$three}
, porque não é uma forma válida de expansão entre chaves, que neste caso espera números inteiros ... Ela só se torna uma forma válida após a expansão $ var, queeval
passa pelo mesmo processo para gerar uma expansão normal da sequência de chaves ... 1 2 3 QED;) ... Resumo: a simples presença de um par de chaves não aciona a expansão de chaves ... apenas um formulário válido a aciona .a={0..9}; echo $a;
não há extensão entre chaves . Usandoeval
, ele funciona. Então eu acho que a explicação do @ mattdm é boa.Como você já percebeu,
{1..3}
expande-se para1 2 3
, mas{foo..bar}
ou{$foo..$bar}
não expansão cinta gatilho, e este último é posteriormente expandido para substituir$foo
e$bar
por seus valores.Um fallback no GNU (por exemplo, Linux não incorporado) é o
seq
comando.Outra possibilidade. se
foo.
não contém nenhum caractere especial do shell, éA solução mais simples é usar o zsh, onde
rm foo.{$ext0..$extN}
faz o que você deseja.fonte
Enquanto as outras respostas discutem o uso
eval
eseq
, embash
, você pode usar umfor
loop de estilo C tradicional em um contexto aritmético. As variáveisext0
eextN
são expandidas dentro da((..))
execução do loop para o intervalo definido.Se você estiver procurando uma maneira ideal e evitar vários
rm
comandos, poderá usar um espaço reservado temporário para armazenar os resultados do nome do arquivo e chamarrm
de uma só vez.e agora chame o
rm
comando na matriz expandidafonte
Notas:
fonte