Como posso usar $ variable em uma expansão de chave shell de uma seqüência?

27

Eu quero usar $var in uma expansão de chave shell com um intervalo, no bash. Simplesmente colocar {$var1..$var2} não funciona, então eu fui "lateral" ...

As obras a seguir, mas são um pouco desajeitadas.

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments

Existe uma maneira mais "normal"?

    
por Peter.O 21.02.2011 / 03:52

3 respostas

18

Você pode tentar:

eval rm foo.{$ext0..$extN}

Não tenho certeza se esta é a melhor resposta, mas certamente é uma delas.

    
por 21.02.2011 / 04:23
18

Como você já percebeu, {1..3} expande para 1 2 3 , mas {foo..bar} ou {$foo..$bar} não aciona a expansão de contraventamento e a segunda é subsequentemente expandida para substituir $foo e $bar por seus valores.

Um fallback no GNU (por exemplo, Linux não incorporado) é o comando seq .

for x in 'seq $ext0 $extN'; do rm foo.$x; done

Outra possibilidade. se foo. não contiver caractere especial de shell, é

rm 'seq $ext0 $extN | sed 's/^/foo./''

A solução mais simples é usar zsh, onde rm foo.{$ext0..$extN} faz o que você quer.

    
por 21.02.2011 / 22:49
0
    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    f_over_range 0 5
    f_over_range 00 05

Notas:

  • O uso do eval expõe o risco de segurança de injeção de comando
  • O Linux imprimirá "00 \ n01 \ n02..etc", mas o OSX imprimirá "1 \ n2 \ n ... etc"
  • O uso de loops de estilo seq ou C não corresponderá à manipulação da expansão de chave dos zeros à esquerda
por 24.08.2018 / 21:26