Fala Itamar,
pensava igualzinho a vc por achar que, em virtude do eval dar duas passadas no cmd, ele ficaria muito lento, mas fiz uns testes e vi que, por ele ser builtin, não é tão lento qto imaginava. Por outro lado algumas vezes vc pode fugir dele, outras não.
Se:
a=b
b=3
Para pegar o valor de b usando a variável a, vc pode fazer:
eval echo $`echo $a` # na primeira passada executa o que está entre crases e na 2a. resolve.
eval echo \$$a # Na 1a. passada tira a \ e troca $a por b e na 2a. resolve.
Mas para resolver esta indireção tem uma solução melhor com expansão de parâmetros (verdadeiros aviões a jato). Ficaria assim:
echo ${!a}
Beleza, mas veja isso:
$ Paipe=\|
$ ls $Paipe wc -l
ls: não é possível acessar |: Arquivo ou diretório não encontrado
ls: não é possível acessar wc: Arquivo ou diretório não encontrado
$ eval ls $Paipe wc -l
282
Aqui não tem como fugir do eval pq vc infringiu a ordem de trabalho do Bash que primeiro resolve os redirecionamentos e depois as variáveis e o que precisávamos era o oposto.