Você pode usar o eval para isso:
$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done
Tome cuidado com as citações e fugindo. Se os valores contiverem espaços em branco ou caracteres glob, os três primeiros dividirão os valores no espaço em branco e, em seguida, expandirão todos os nomes de arquivos que correspondam ao glob. Isso pode ou não ser o que você quer. Por exemplo:
$ var1='< x >' var2='< * >' $ for i in 1 2; do eval echo \$var$i; done < x > < [list of filenames in current directory] >
(Observe que os espaços duplos em torno de x
foram reduzidos a espaços únicos, pois echo
recebeu <
, x
e >
como argumentos separados.)
Para contornar isso, você precisa garantir que a expansão da variável seja citada no eval
, por exemplo:
$ for i in 1 2; do eval echo \"\$var"$i"\"; done
< x >
< * >
(cite o $i
também, como acima, a menos que você saiba que IFS
não contém nenhum dígito.)