Shell: Conteúdo de variável dentro de outra variável (eval)

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
This entry was posted in Shell. Bookmark the permalink.

One Response to Shell: Conteúdo de variável dentro de outra variável (eval)

  1. eddu says:

    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…

Leave a Reply

Your email address will not be published. Required fields are marked *