在bash中,我如何回显变量名,而不是变量值?[关闭]


18

假设我var在bash中有一个变量。我可以给它赋一个值。例如,我将其设置为字符串:

var="Test"

我要echo的名字var,而不是所拥有的价值var。(我可以用做后者echo $var,但实际上我想做前者。)

SO对此问题的答案说可以使用echo ${!var},但是当我这样做时,我只回显一个空行。例如,此bash脚本

#!/bin/bash

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

返回此输出:

Hi

Bye

HiBye之间只有一个空行,而不是var。我究竟做错了什么?

我在Ubuntu 10.04.4上运行bash 4.1.5(1)


11
呃...只是echo var吗?
Braiam

5
我真的不明白这一点。正如@Braiam指出的那样,由于首先要定义变量的名称,因此您将始终知道该变量并能够打印该变量。您实际上想做什么?
terdon

3
我认为您已经错过了SO解决方案的漂移;试试var=Test; Test=SO; echo ${!var}
iruvar

我也不太明白,但这是您想要做什么?回声是$ var'
雷南维森特

我真的很好奇,请告诉我们您需要什么!
bubakazouba

Answers:


22

外壳参数扩展 $ {!名字@}$ {!名称*}可以做的伎俩,

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

虽然可行,但我无法想象此工具的实用性...


2
请注意,如果foo未定义,但foobar将得到foobar。其他备选方案:var_name=${-+foo}(或${foo+foo}var_name=$'foo'var_name=$"foo":-)
斯特凡Chazelas

1
如果定义了两个变量foo和foobar,则表达式的${!foo@}计算结果为foo foobar。正如答案所说,它的效用很难想象。
CppNoob

30

如果只想输出静态变量名称,可以转义$-sign:

echo \$var

3
这应该是公认的解决方案。
David Poxon

9
不全!这个答案不是一个好的解决方案。这将只是输出$var,但是如果变量名是动态的,则它是无用的。例如,假设您需要过滤以开头的一组环境变量PREFIX_,但是您不知道集合的大小或其中的变量名称。公认的解决方案更适合这种情况。
埃克托巴尔韦德帕雷哈

aka var_name =“ $(echo \ $ var)”
Yordan Georgiev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.