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}
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?
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}
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
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
Tags bash arithmetic