Bash 引用附加变量?

Bash 引用附加变量?,bash,Bash,如何在bash脚本中实现这一点 #!/bin/sh func() { export ${NAME}_SUFFIX=`result_of_some_command` } NAME=my_name func # This variable will become my_name_SUFFIX # but how can I reference it using $NAME? echo ${${NAME}_SUFFIX} # Doesn't work... 如果可以通过函数调用,我会

如何在bash脚本中实现这一点

#!/bin/sh

func() {
export ${NAME}_SUFFIX=`result_of_some_command`
}

NAME=my_name
func

# This variable will become my_name_SUFFIX
# but how can I reference it using $NAME?

echo ${${NAME}_SUFFIX}     # Doesn't work...

如果可以通过函数调用,我会使用declare,但似乎不行。另外,我的declare版本不支持-x。

您需要变量间接寻址,它是由
引入的

var_name=test
test=value
echo ${var_name}  # will echo test
echo ${!var_name} # will echo value

您需要变量间接寻址,它是通过
引入的

var_name=test
test=value
echo ${var_name}  # will echo test
echo ${!var_name} # will echo value

可以使用间接参数展开:

varname=${NAME}_SUFFIX
echo "${!varname}"

bash
4.3还引入了namerefs,使用起来稍微简单一些

$ NAME=FOO
$ FOO_SUFFIX=3
$ declare -n varname=${NAME}_SUFFIX
$ echo $varname
3

可以使用间接参数展开:

varname=${NAME}_SUFFIX
echo "${!varname}"

bash
4.3还引入了namerefs,使用起来稍微简单一些

$ NAME=FOO
$ FOO_SUFFIX=3
$ declare -n varname=${NAME}_SUFFIX
$ echo $varname
3

我知道你想做什么…警告。“eval”是一种可怕的方法,变量间接寻址更好。但是,这是你想要的

对脚本的一个简单更改:

将“导出”更改为“评估”,它就会工作。你在那里走了大半段路! 哦,并更改您的“echo”语句,如下所示

示例:

#!/bin/sh

func() {
eval ${NAME}_SUFFIX=`result_of_some_command`
}

NAME=my_name
func

# This variable will become my_name_SUFFIX
# but how can I reference it using $NAME?

eval echo "\${${NAME}_SUFFIX}"

我知道你想做什么…警告。“eval”是一种可怕的方法,变量间接寻址更好。但是,这是你想要的

对脚本的一个简单更改:

将“导出”更改为“评估”,它就会工作。你在那里走了大半段路! 哦,并更改您的“echo”语句,如下所示

示例:

#!/bin/sh

func() {
eval ${NAME}_SUFFIX=`result_of_some_command`
}

NAME=my_name
func

# This variable will become my_name_SUFFIX
# but how can I reference it using $NAME?

eval echo "\${${NAME}_SUFFIX}"

declare-x
至少从
bash
2.0.2开始得到支持。对不起,我的意思是-g.
declare-x
至少从
bash
2.0.2开始得到支持。对不起,我的意思是-g.是的,但是我可以使用varname开始:export varname=
result\u of_some\u命令
我需要它在$\{NAME}_后缀}ish形式。
varname
func
之外使用。它的值是您想要其值的变量的名称。是的,但是我可以使用varname作为开头:export varname=
result\u\u some\u命令
我需要它以$\${name}\u SUFFIX}形式出现。
varname
func
之外使用。它的值是您想要其值的变量的名称;变量间接寻址是更好的方法。但是,再一次,这是你要求的。如果您有任何问题,请告诉我。非常感谢,这是我一直在寻找的@当然是皇帝。如果这是你想要的答案,别忘了把问题标为已回答。当心!我只想再次强调;变量间接寻址是更好的方法。但是,再一次,这是你要求的。如果您有任何问题,请告诉我。非常感谢,这是我一直在寻找的@当然是皇帝。如果这是你想要的答案,别忘了把问题标为已回答。当心!