在 bash 中,如何回显变量名,而不是变量值?

And*_*rew 24 bash

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

var="Test"
Run Code Online (Sandbox Code Playgroud)

我想要的是echo的名称var,而不是var. (我可以用 做后者echo $var,但我实际上想做前者。)

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

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"
Run Code Online (Sandbox Code Playgroud)

返回此输出:

Hi

Bye
Run Code Online (Sandbox Code Playgroud)

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

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

mjt*_*ner 33

如果你想简单地输出一个静态变量名,你可以转义 -$符号:

echo \$var
Run Code Online (Sandbox Code Playgroud)

  • 一点都没有!!这个答案不是一个好的解决方案。这将简单地输出 `$var`,但如果变量名称是动态的,则它是无用的。例如,假设您需要过滤一组以“PREFIX_”开头的环境变量,但您不知道该组的大小或其中的变量名称。公认的解决方案更适合这种场景。 (13认同)
  • 这应该是公认的解决方案。 (4认同)

xae*_*xae 30

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

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar
Run Code Online (Sandbox Code Playgroud)

虽然可行,但我无法想象它的效用......

  • 请注意,如果没有定义 `foo` 但定义了 `foobar`,你将得到 `foobar`。其他替代方案:`var_name=${-+foo}`(或`${foo+foo}`)、`var_name=$'foo'`、`var_name=$"foo"` :-) (2认同)