猿问

按名称间接查找shell变量

假设我在另一个变量中存储了一个变量名:


myvar=123

varname=myvar

现在,我想仅通过使用$ varname变量获得123。有直接的方法吗?我发现没有内置的bash可以按名称查找,因此提出了以下建议:


function var { v="\$$1"; eval "echo "$v; }

所以


var $varname  # gives 123

最终看起来还不错,但是我想知道我是否错过了更明显的事情。提前致谢!


开心每一天1111
浏览 517回答 3
3回答

catspeake

在bash的手册页中:${!varname}如果参数的第一个字符是感叹号,则将引入变量间接寻址级别。Bash使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并在其余替换中使用该值,而不是参数本身的值。这称为间接扩展。

忽然笑

没有直接的符合Posix的语法,只有一个bashism。我通常这样做:eval t="\$$varname"这将在任何Posix shell上都可以使用,包括那些bash登录shell以及/bin/sh更小,更快的东西(例如)的系统ash。我喜欢bash并将其用于我的登录shell,但我避免在命令文件中使用bashisms。注意:编写特定于bash的脚本的一个问题是,即使您可以指望安装的bash,它也可能在路径上的任何位置。在这种情况下,最好使用完全通用的/usr/bin/env shebang样式,但是请注意,这仍然不是100%可移植的,并且存在安全问题。
随时随地看视频慕课网APP
我要回答