Vamos supor que eu declarei 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
Eu gostaria de encontrar uma maneira de imprimir o conteúdo do conteúdo de $var
(que é o conteúdo de $test
). Então 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 haja problema em deixar de fora a
$
variável de referência):3.5.3 Expansão do Parâmetro do Shell
Para o caso em que o nome da variável contido em
var
é prefixado com$
você pode usareval
:O que acontece aqui:
$var
para o valor$test
, produzindo umeval echo $test
comando;eval
avaliaecho $test
a expressão e produz um resultado desejado.Observe que o uso
eval
em geral pode ser perigoso (dependendo do que estiver armazenado emvar
), portanto, prefira evitá-lo. O recurso de expansão indireta é melhor para o seu caso (mas você precisa se livrar do$
login$test
).Semelhante à resposta de Jesse_b , mas usando uma variável de referência de nome em vez de indireção de variável (requer
bash
4.3+):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 referências de nome recursivamente:Para completar, usar uma matriz associativa (em
bash
4.0+) também é uma maneira de resolver isso, dependendo dos requisitos:Isso fornece uma maneira mais flexível de acessar mais de um valor por uma chave ou nome que pode ser determinado dinamicamente. Isso pode ser preferível se você quiser coletar todos os valores de uma categoria específica em um único array, mas ainda poder acessá-los por alguma chave (por exemplo, nomes acessíveis por ID ou nomes de caminho acessíveis por finalidade etc.), pois não polui o namespace variável do script.
Com
zsh
:Com qualquer shell tipo Bourne
Lembre-se que nesses shells as expansões de variáveis devem ser citadas para evitar split+glob (
zsh
sendo uma exceção) eecho
não podem ser usadas para dados arbitrários.Como com ambos
(e)
eeval
há avaliação de código de shell, é importante que o conteúdo$var
permaneça sob seu controle, caso contrário, isso pode ser uma vulnerabilidade de injeção de comando arbitrária (o mesmo com${!var}
abordagens).