Você precisa de eval
para fazer do jeito que está tentando fazer ...
numbers2004={625..721}
numbers2005={723..823}
for year in 2004 2005
do
eval 'eval "for number in '"\$numbers$year"'
do
echo \"\$year \$number\"
done"'
done
... que imprime ...
2004 625
...
2004 721
2005 723
...
2005 823
Mas isso é uma maneira horrível de fazê-lo - e não apenas porque a citação é um pesadelo -, mas provavelmente porque o seu shell faz todo o trabalho duas vezes . Primeiro, ele deve gerar todos os {brace..expanded}
iterables antes e depois iterar sobre cada um deles.
Em vez disso, talvez:
y=4 n=623 c=721
while [ "$((y+=$c<(c+=102*(c<(n+=1<<(c==n))))))" -lt 6 ]
do echo "200$y $n"
done
... que imprime o mesmo nas versões recentes de busybox ash
, ksh93
, dash
, yash
, bash
, zsh
, mksh
e posh
.
A expressão aritmética pode ser levada um pouco mais para a maioria daqueles avaliando partes dela somente quando necessário, como ...
y=4 n=623 c=721
while [ "$((c<(n+=1)?(y+=(n+=1)<(c+=102)):y))" -lt 6 ]
do echo "200$y $n"
done
... que funciona de forma idêntica em todos os shells mencionados, com exceção de busybox
. Parece que busybox
sempre avalia todos os lados da instrução if expr ? true : false
ternário e, portanto, falha em iterar conforme o esperado.