按名称查找shell变量,间接

ing*_*ger 13 bash eval

假设我将变量的名称存储在另一个变量中:

myvar=123
varname=myvar
Run Code Online (Sandbox Code Playgroud)

现在,我想通过使用$ varname变量得到123.有直接的方法吗?我发现没有这样的bash内置用于按名称查找,所以想出了这个:

function var { v="\$$1"; eval "echo "$v; }
Run Code Online (Sandbox Code Playgroud)

所以

var $varname  # gives 123
Run Code Online (Sandbox Code Playgroud)

这最终看起来并不太糟糕,但我想知道我是否错过了一些更明显的东西.提前致谢!

tan*_*ens 15

bash手册页:

${!varname}
Run Code Online (Sandbox Code Playgroud)

如果参数的第一个字符是感叹号,则引入变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为间接扩张.


Dig*_*oss 12

没有直接符合Posix的语法,只有一个bashism.我经常这样做:

eval t="\$$varname"
Run Code Online (Sandbox Code Playgroud)

这适用于任何Posix shell,包括那些bash登录shell的系统,它们/bin/sh更小更快ash.我喜欢bash并将它用于我的登录shell但我避免在命令文件中使用bashisms.


注意:编写特定于bash的脚本的一个问题是即使你可以指望安装bash,它也可能在路径上的任何地方.在这种情况下使用完全一般的/usr/bin/env shebang风格可能是一个好主意,但请注意,这仍然不是100%便携并且存在安全问题.