Palavras-chave: shell, variável dentro de variável, eval
Às vezes precisamos pegar o conteúdo de uma variável cujo nome está contido em outra variável. Será mostrado algumas maneiras de realizar esta tarefa:
$ A=XXX
$ B=A
$ echo $B
A
$ echo ${!B}
XXX
$ eval echo \\$$B
XXX
$ eval echo '$'$B
XXX
Exemplo prático:
#!/bin/bash
VERDE="echo -en \\e[1;32m"
AZUL="echo -en \\e[1;36m"
VERMELHO="echo -en \\e[1;31m"
NORMAL="echo -en \\e[0;39m"
# função que imprime um texto colorido
imprime_colorido() {
eval \\$$1 # seta para a cor passada (primeiro parâmetro)
shift
echo $* # imprime o texto
$NORMAL # volta para a cor padrão
}
imprime_colorido VERDE texto em verde
imprime_colorido AZUL texto em azul
imprime_colorido VERMELHO texto em vermelho
Outra situação é quando precisamos obter o conteúdo de uma variável cujo pedaço do nome está contido em outra variável:
$ passo1=codificar
$ passo2=testar
$ i=1
$ eval echo \\$passo$i
codificar
$ i=2
$ eval echo '$passo'$i
testar
$ tmp=passo$i # usando uma variável temporária
$ echo ${!tmp}
testar
$ for i in 1 2; do eval echo passo$i = '$passo'$i; done
passo1 = codificar
passo2 = testar





how use this with arrays?
i have
b1=(10 20 30)
b2=(40 50 60)
b3=(70 80 90)
and i was wondering if a single for loop could give me the result below
b1[1] = 10
b1[2] = 20
b1[3] = 30
b2[1] = 40
b2[2] = 50
b2[3] = 60
b3[1] = 70
b3[2] = 80
b3[3] = 90
thanks anyway…