首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量的变量

变量的变量
EN

Stack Overflow用户
提问于 2014-12-22 21:53:16
回答 2查看 207关注 0票数 3

我必须打印一个变量值,它是art变量。例如:变量为

代码语言:javascript
复制
A = X
Z_X = Test

在shell中使用

代码语言:javascript
复制
setenv A X
setenv Z_X Test

我想使用$A打印$Z_X值

我正在尝试,但没有任何成功。

代码语言:javascript
复制
echo ${Z_${A}}
echo ${Z_[$A]}

有人能告诉我我哪里错了吗?

问候

EN

回答 2

Stack Overflow用户

发布于 2014-12-23 00:23:03

A=X

Z_X =测试

这似乎是错误的;在csh中,您需要使用set关键字为变量赋值;此外,约定“正常”变量也使用小写,环境变量使用大写:

代码语言:javascript
复制
set a = x
set z_x = Test

然后,您可以使用eval获得您想要的内容:

代码语言:javascript
复制
% eval echo \$z_$a
Test

% set x = `eval echo \$z_$a`
% echo $s
Test

如果您不信任$a的源代码,这可能是危险的,因为它也可能执行rm -rf /或类似的危险操作(但如果您信任$a的源代码,则完全没有问题)。

您可以使用set获取所有变量的列表

代码语言:javascript
复制
% set | grep ^z_$a
z_x     Test

% set | grep ^z_$a | awk '{print $1}'
z_x

这是我能想出的唯一安全的方法来做你想要的。

票数 0
EN

Stack Overflow用户

发布于 2014-12-22 21:58:43

一般来说,这不是一个好主意,你应该重新考虑你的方法。

  • 您可以使用间接扩展:

名称回显${!name=Z_$A }

从手册中:

如果参数的第一个字符是感叹号(!),则会引入一定级别的变量间接寻址。Bash使用由参数的其余部分组成的变量的值作为变量的名称;然后扩展该变量,并在替换的其余部分中使用该值,而不是参数本身的值。这就是所谓的间接扩展。下面描述的${!prefix*}${!name[@]}的扩展是个例外。感叹号必须紧跟在左大括号后面,才能引入indirection.

  • Or间接引用:

name=Z_$A评估回显\$$名称

你可以在指南中找到更多关于indirect references的信息。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27604063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档