Você pode fazer isso usando a expansão de variável indireta do bash (desde que não seja problema deixar de fora o $
da sua variável de referência):
$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string
Vamos supor que eu tenha declarado as seguintes variáveis:
$ var='$test'
$ test="my string"
Se eu imprimir seu conteúdo, vejo o seguinte:
$ echo $var
$test
$ echo $test
my string
Gostaria de encontrar uma maneira de imprimir o conteúdo do conteúdo de $var
(que é o conteúdo de $test
). Então eu tentei fazer o seguinte:
$ echo $(echo $var)
$test
Mas aqui o resultado é $test
e não "my string"
... É possível imprimir o conteúdo do conteúdo das variáveis usando o bash?
Você pode fazer isso usando a expansão de variável indireta do bash (desde que não seja problema deixar de fora o $
da sua variável de referência):
$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string
Para o caso em que o nome da variável contido em var
é prefixado com $
, você pode usar eval
:
$ var='$test'
$ test="my string"
$ eval echo $var
my string
O que acontece aqui:
$var
para o valor $test
, produzindo um comando eval echo $test
; eval
avalia a expressão echo $test
e produz um resultado desejado. Note que usar eval
em geral pode ser perigoso (dependendo do que está armazenado em var
), então prefira evitá-lo. O recurso de expansão indireta é melhor para o seu caso (mas você precisa se livrar do $
login em $test
).
Semelhante a resposta de Jesse_b , mas usando uma variável de referência de nome em vez de indireto de variável (requer bash
4.3 +):
$ declare -n var=test
$ test="my string"
$ echo "$var"
my string
A variável de referência de nome var
contém o nome da variável que está referenciando. Quando a variável é desreferenciada como $var
, o valor dessa outra variável é retornado.
bash
resolve as referências de nome recursivamente:
$ declare -n var1=var2
$ declare -n var2=test
$ test="hello world"
$ echo "$var1"
hello world
Para completar, usar uma matriz associativa (em bash
4.0+) também é uma maneira de resolver isso, dependendo dos requisitos:
$ declare -A strings
$ strings[test]="my string"
$ var=test
$ echo "${strings[$var]}"
my string
Isso fornece uma maneira mais flexível de acessar mais de um valor por uma chave ou nome que pode ser determinado dinamicamente.
com zsh
:
$ var='$test'
$ test='*'
$ printf '%s\n' ${(e)var}
*
Com qualquer shell parecido com o Bourne
$ eval 'printf "%s\n" "'"$var"'"'
*
Lembre-se que nesses shells as expansões de variáveis devem ser citadas para evitar split + glob ( zsh
sendo uma exceção) e echo
não pode ser usado para dados arbitrários.
Já que com (e)
e eval
há avaliação de código de shell, é importante que o conteúdo de $var
permaneça dentro de seu controle, caso contrário isso pode ser uma vulnerabilidade arbitrária de injeção de comando (mesmo com ${!var}
abordagens).