É possível usar variáveis em chaves de contagem no Bash?

6

Estou procurando uma solução para um problema do Bash 4 que tenho.

O Bash 4 é capaz de interagir com zeros iniciais.

Para a linha:

for i in {001..005}; do echo -n $i" ";done;echo

a saída é

001 002 003 004 005

mas quando eu tento isso:

a="005"; for i in {001..${a}}; do echo $i;done

ou algo similar, o resultado é:

{001..005}

O que estou perdendo?

    
por user61369 26.02.2014 / 07:56

3 respostas

5

Seu problema é a ordem na qual a expansão de chave e a expansão de variável são aplicadas. Você deve forçar a ordem inversa:

a=005
eval echo {001..$a}
    
por 26.02.2014 / 08:14
3

A expansão da cinta é executada antes de qualquer outra expansão ... .

Você pode usar seq :

$ a="005"; for i in $(seq -f %03g 001 ${a}); do echo $i;done
001
002
003
004
005
    
por 26.02.2014 / 08:30
3

A expansão do recurso acontece muito cedo durante a expansão (primeira coisa, na verdade ), antes da expansão da variável. Para executar a expansão de contraventamento no resultado de uma expansão variável, você precisa usar eval , mas isso tende a ser desajeitado.

A maneira fácil de iterar é usar uma variável de contador.

for ((i = 1; i < 5; i++)); do echo -n $i" "; done

Para adicionar os zeros à esquerda, você pode formatar o número com printf:

for ((i = 1; i < 5; i++)); do printf "%03d " $i; done

Um truque alternativo é contar números que são dez vezes maiores e eliminar o prefixo estranho.

delta=1000
for ((i = $((delta+1)); i < $((delta+5)); i++)); do echo -n "${i#1} "; done
    
por 27.02.2014 / 04:47