É uma questão de precedência. As expansões de chaves são avaliadas antes a variável é:
$ foo="10"
$ echo {1.."$foo"}
{1..10}
Ou, com mais detalhes:
$ set -x
$ echo {1.."$foo"}
+ echo '{1..10}'
{1..10}
Isso está documentado em man bash
:
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.
Em outras palavras, quando você tenta usar {1..$foo}
, a primeira coisa que o bash fará é tentar avaliar a expansão da chave. Neste ponto, a variável ainda não foi substituída por seu valor, é simplesmente $foo
. Portanto, o que o bash vê é equivalente a {1..SOMESTRING}
:
$ echo {1..SOMESTRING}
{1..SOMESTRING}
Como esta é uma questão da ordem em que o shell executa determinadas operações, não há solução alternativa. Você simplesmente não pode usar variáveis dessa maneira dentro da expansão de chaves. Você terá que encontrar uma maneira diferente de fazer isso. Por exemplo, use seq
:
for i in $(seq 1 "$REPEAT"); do
echo "${MESSAGE}"
done
Ou:
for((i=0;i<=$REPEAT;i++)); do
echo "${MESSAGE}"
done