En bash, comment puis-je faire écho au nom de la variable, pas à la valeur de la variable? [fermé]

18

Supposons que j'ai une variable varen bash. Je peux lui attribuer une valeur. Par exemple, je vais en faire une chaîne:

var="Test"

Je veux echole nom de var, pas la valeur détenue par var. (Je peux faire ce dernier avec echo $var, mais je veux vraiment faire le premier.)

La réponse à cette question de SO dit d'utiliser echo ${!var}, mais quand je le fais, je renvoie simplement une ligne vierge. Par exemple, ce script bash

#!/bin/bash

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

renvoie cette sortie:

Hi

Bye

avec juste une ligne vierge entre Hi et Bye , au lieu de var . Qu'est-ce que je fais mal?

J'utilise bash 4.1.5 (1) sur Ubuntu 10.04.4 .

Andrew
la source
11
Euh ... juste echo var?
Braiam
5
Je ne comprends pas vraiment l'intérêt de cela. Comme le souligne @Braiam, puisque vous définissez le nom de la variable en premier lieu, vous la connaîtrez toujours et pourrez toujours l'imprimer. Qu'essayez-vous de faire?
terdon
3
Je pense que vous avez raté la dérive de la solution SO; essayervar=Test; Test=SO; echo ${!var}
iruvar
Je ne comprends pas trop, mais qu'est-ce que tu essaies de faire? écho '$ var'
Renan Vicente
Je suis vraiment curieux, dites-nous pourquoi vous en aviez besoin!
bubakazouba

Réponses:

22

L' expansion des paramètres shell $ {! Name @} ou $ {! Name *} pourrait faire l'affaire,

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

Bien que faisable, je ne peux pas imaginer l'utilité de cela ...

xae
la source
2
Notez que si foon'est pas défini mais l' foobarest, vous obtiendrez foobar. Autres alternatives: var_name=${-+foo}(ou ${foo+foo}), var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas
1
S'il y avait deux variables visibles, foo et foobar, toutes deux définies, l'expression ${!foo@}serait évaluée à foo foobar. Comme le remarque la réponse, son utilité est difficile à imaginer.
CppNoob
30

Si vous souhaitez simplement afficher un nom de variable statique, vous pouvez échapper au $signe-:

echo \$var
mjturner
la source
3
Cela devrait être la solution acceptée.
David Poxon
9
Pas du tout!! Cette réponse n'est pas une bonne solution. Cela va simplement sortir $var, mais c'est inutile si le nom de la variable est dynamique. Par exemple, supposons que vous ayez besoin de filtrer un ensemble de variables d'environnement commençant par a PREFIX_, mais vous ne connaissez pas la taille de l'ensemble ou les noms de variables qu'il contient. La solution acceptée convient mieux à ce scénario.
Héctor Valverde Pareja
aka var_name = "$ (echo \ $ var)"
Yordan Georgiev