Na verdade, existe um método adicional para fazer as indirecções no Bash, pelo menos de forma eficaz: Se tiver a=1
e b=a
, pode obter o valor de a
a b
da seguinte forma:
eval echo \${$b}
Isso pode ser aninhado várias vezes:
$ a=1; b=a; c=b; d=c
$ eval eval eval echo \\\\${\\${\${$d}}}
1
Aqui estão as regras para encontrar o número certo de barras invertidas em cada nível:
- No nível mais interno, nenhuma barra invertida é usada.
- Em qualquer outro nível, use 2 n + 1 barras invertidas, onde n é o número de barras invertidas que são usadas no próximo nível interno.
Justificativa: A regra 1 é trivial. Regra 2 vem do fato de que você tem que aplicar mais uma barra invertida no próximo nível interno, enquanto você tem que escapar de todos aqueles que não são consumidos no nível atual, ou seja, todos menos um.
Como consequência, o número de barras invertidas necessárias diverge exponencialmente com o aumento do número de níveis, de modo que o aninhamento atinge seu limite em breve para esse método.
Mas é preciso enfatizar aqui que esse limite é de natureza bastante acadêmica. Na prática, quando se tem que respeitar necessidades como manutenção, normalmente não se quer lidar com mais do que dois ou três níveis de indireção em uma única expressão - não importa qual método de indireção seja usado.
Em vez disso, pode-se resolver níveis mais altos de indireção usando um loop para iterar algo como
value=${variable}
variable=${!value}
um número de vezes que é adequado para a aplicação dada.