Vamos supor que eu tenha declarado as seguintes variáveis:
$ var='$test'
$ test="my string"
Se eu imprimir o 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
(qual é 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 de variáveis usando o bash?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
fonte
fonte
ash
, oubash
, oucsh
, oudash
, ..., ouzsh
, ou POSIXsh
, ou precisa trabalhar em diferentes sistemas?Respostas:
Você pode fazer isso usando a expansão indireta da variável do bash (desde que não seja permitido deixar de fora a
$
variável de referência):3.5.3 Expansão dos parâmetros do shell
fonte
Para o caso em que o nome da variável contido em
var
é prefixado,$
você pode usareval
:O que acontece aqui:
$var
para o valor$test
, produzindo umeval echo $test
comando;eval
avalia aecho $test
expressão e produz o resultado desejado.Observe que o uso
eval
em geral pode ser perigoso (dependendo do que está armazenadovar
), portanto, prefira evitá-lo. O recurso de expansão indireta é melhor para o seu caso (mas você precisa se livrar do$
login$test
).fonte
eval
, você precisa de duas camadas de aspas duplas, esta linha:eval echo "\"$var\""
. Lembre-se, isso não faz nada sobre os outros perigos do usoeval
que você mencionou.Semelhante à resposta de Jesse_b , mas usando uma variável de referência de nome em vez de variável indireta (requer
bash
4.3+):A variável de referência de nome
var
contém o nome da variável à qual está fazendo referência. Quando a variável é desreferenciada como$var
, o valor dessa outra variável é retornado.bash
resolve recursivamente as referências de nome:Para completar, o uso de 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ê deseja coletar todos os valores de uma categoria específica em uma única matriz, mas ainda conseguir 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 espaço de nomes variável do script.
fonte
Com
zsh
:Com qualquer concha tipo Bourne
Lembre-se de que nesses shells expansões 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 os dois
(e)
e com aeval
avaliação do código do shell, é importante que o conteúdo$var
fique sob seu controle, caso contrário isso pode ser uma vulnerabilidade arbitrária à injeção de comandos (o mesmo com as${!var}
abordagens).fonte