将Shell命令的输出作为变量使用

5

我希望将echo命令的输出作为变量名使用。比如:

var1="test"
var2="script"
echo ${$1}

如果$1是var1,那么echo应该输出test。 ${$1}会抛出错误"bad substitution"。
2个回答

3
你需要的是称为变量扩展(或间接扩展)的内容。你需要使用语法${!var}
~$ cat s.sh
var1="test"
var2="script"
echo ${!1}
~$ ./s.sh var1
test
~$ ./s.sh var2
script

来自man bash:

${parameter}

参数的值被替换。当参数是一个超过一位数字的位置参数时,或者当参数后面跟着一个不被解释为其名称一部分的字符时,需要使用大括号。

如果参数的第一个字符是感叹号(!),则会引入变量间接性级别。Bash使用由参数的其余部分形成的变量的值作为变量的名称;然后扩展此变量,并在替换的其余部分中使用该值,而不是参数本身的值。这称为间接扩展。以下是${!prefix*}和${!name[@]}扩展的例外情况。感叹号必须紧随左括号之后才能引入间接性。


2
${!prefix*}${!prefix@}扩展并不是这里的目标所关注的。 - Etan Reisner
@EtanReisner 确实...我认为,例如,echo ${!var1}echo ${!var1*}都会输出test - fredtantini
${!prefix*}扩展会扩展为变量名称而不是值。但是,您可以在间接扩展中使用这些名称本身来获取值。 - Etan Reisner

0
你可以这样做:
$ foo='bar'
$ baz='foo'
$ echo ${!baz}
bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接