In bash, come posso fare eco al nome della variabile, non al valore della variabile? [chiuso]


18

Supponiamo che io abbia una variabile varin bash. Posso assegnargli un valore. Ad esempio, lo trasformerò in una stringa:

var="Test"

Voglio echoil nome di var, non il valore detenuto da var. (Posso fare il secondo con echo $var, ma in realtà voglio fare il primo.)

La risposta a questa domanda di SO dice di usare echo ${!var}, ma quando lo faccio echo solo una riga vuota. Ad esempio, questo script bash

#!/bin/bash

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

restituisce questo output:

Hi

Bye

con solo una riga vuota tra Ciao e Ciao , invece di var . Che cosa sto facendo di sbagliato?

Sto eseguendo bash 4.1.5 (1) su Ubuntu 10.04.4 .


11
Err ... solo echo var?
Braiam,

5
Non capisco davvero il punto di questo. Come sottolinea @Braiam, poiché in primo luogo stai definendo il nome della variabile, lo saprai sempre e sarai sempre in grado di stamparlo. Cosa stai davvero cercando di fare?
terdon

3
Penso che tu abbia perso la deriva della soluzione SO; provarevar=Test; Test=SO; echo ${!var}
iruvar,

Non capisco anche io ma è cosa stai cercando di fare? echo '$ var'
Renan Vicente,

Sono davvero curioso, per favore dicci per cosa ti serviva!
bubakazouba,

Risposte:


22

L' espansione dei parametri della shell $ {! Name @} o $ {! Name *} potrebbe fare il trucco,

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

Sebbene fattibile non riesco a immaginare l'utilità di questo ...


2
Nota che se foonon è definito ma lo foobarè, otterrai foobar. Altre alternative: var_name=${-+foo}(o ${foo+foo}), var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas

1
Se fossero visibili due variabili, foo e foobar, entrambe definite, l'espressione ${!foo@}valuterà foo foobar. Come osserva la risposta, la sua utilità è difficile da immaginare.
CppNoob,

30

Se vuoi semplicemente generare un nome di variabile statica, puoi sfuggire al $segno:

echo \$var

3
Questa dovrebbe essere la soluzione accettata.
David Poxon,

9
Non ad !! Questa risposta non è una buona soluzione. Questo sarà semplicemente l'output $var, ma è inutile se il nome della variabile è dinamico. Ad esempio, supponiamo che sia necessario filtrare un set di variabili di ambiente che iniziano con a PREFIX_, ma non si conoscono le dimensioni del set o i nomi delle variabili in esso. La soluzione accettata è più adatta a questo scenario.
Héctor Valverde Pareja,

aka var_name = "$ (echo \ $ var)"
Yordan Georgiev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.