{1..8}
é uma forma de expansão de chaves introduzida por zsh
e suportada por versões recentes de bash
e ksh93
. Em bash
, isso é feito muito cedo. Em particular, é feito antes expansão da variável.
Embora {1..8}
seja válido, {1..$N}
não é porque $N
não é um número decimal, são os dois caracteres $
e N
nenhum dos quais são dígitos decimais.
Mesmo que isso funcionasse, isso não seria muito eficiente. O shell teria que alocar na memória uma lista feita dos números 1 para $N
. Se $N
fosse 10 9 , isso significaria alocar gigabytes de memória.
$(seq "$N")
é ainda menos eficiente. Primeiro, não é portátil. seq
é um comando GNU não padrão. Em seguida, fazer $(seq "$N")
significa iniciar um novo processo, executar seq
nele, o shell ler sua saída por meio de um pipe e armazená-lo na memória, depois dividir essa lista (de acordo com $IFS
) e tentar executar a geração de nome de arquivo isso.
O espaço para a lista resultante dessa divisão e globbing também deve ser alocado.
Uma maneira mais eficiente de fazer isso é usar o estilo de loop ksh
for (( ))
(também suportado por bash
e zsh
por décadas).
for ((i = 1; i <= N; i++)); do
<loop content>
done
Ou simplesmente escreva-o da maneira padrão e portátil, assim você não precisa usar bash
, e pode usar seu (provavelmente mais rápido / mais magro) sistema sh
:
i=1
while [ "$i" -le "$N" ]; do
<loop content>
i=$(($i + 1))
done
Ou talvez você possa fazer isso da maneira mais fácil, evitando loops completamente. Mas precisamos saber o que você quer fazer para ajudar lá.