{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á.