No bash, como posso ecoar o nome da variável, não o valor da variável? [fechadas]

18

Suponha que eu tenha uma variável varno bash. Eu posso atribuir um valor a ele. Por exemplo, vou fazer uma string:

var="Test"

Eu quero echoo nome de var, não o valor mantido por var. (Eu posso fazer o último com echo $var, mas realmente quero fazer o primeiro.)

A resposta para esta pergunta do SO diz para usar echo ${!var}, mas quando faço isso, eco apenas retorna uma linha em branco. Por exemplo, este script bash

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"

retorna esta saída:

Hi

Bye

com apenas uma linha em branco entre Hi e Bye , em vez de var . O que estou fazendo de errado?

Estou executando o bash 4.1.5 (1) no Ubuntu 10.04.4 .

Andrew
fonte
11
Err ... apenas echo var?
Braiam
5
Eu realmente não entendo o ponto disso. Como o @Braiam aponta, como você está definindo o nome da variável em primeiro lugar, você sempre a conhecerá e poderá imprimi-la. O que realmente você está tentando fazer?
terdon
3
Eu acho que você perdeu a deriva da solução SO; experimentarvar=Test; Test=SO; echo ${!var}
iruvar
Eu também não entendo, mas é o que você está tentando fazer? echo '$ var'
Renan Vicente
Estou muito curioso, por favor, diga-nos o que você precisava disso!
bubakazouba

Respostas:

22

A expansão do parâmetro shell $ {! Name @} ou $ {! Name *} poderia fazer o truque,

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar

Embora viável, não consigo imaginar a utilidade disso ...

xae
fonte
2
Observe que, se foonão estiver definido, mas foobarestiver, você receberá foobar. Outras alternativas: var_name=${-+foo}(ou ${foo+foo}), var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas
1
Se houvesse duas variáveis ​​visíveis, foo e foobar, ambas definidas, a expressão ${!foo@}seria avaliada como foo foobar. Como observa a resposta, é difícil imaginar sua utilidade.
CppNoob 26/03
30

Se você deseja simplesmente emitir um nome de variável estática, pode escapar do $-sign:

echo \$var
mjturner
fonte
3
Essa deve ser a solução aceita.
David Poxon
9
Nem um pouco !! Esta resposta não é uma boa solução. Isso simplesmente será gerado $var, mas será inútil se o nome da variável for dinâmico. Por exemplo, digamos que você precise filtrar um conjunto de variáveis ​​de ambiente começando com umPREFIX_ , mas você não sabe sobre o tamanho do conjunto ou os nomes de variáveis ​​nele. A solução aceita é mais adequada para esse cenário.
Héctor Valverde Pareja
aka var_name = "$ (eco \ $ var)"
Yordan Georgiev