Bash:回显一个变量,其名称是另一个变量的值

Bash:回显一个变量,其名称是另一个变量的值

假设我有以下内容:

foo1=abc
i=1
a="FOO${i}"
echo ${${a}}
echo ${`echo $a`} # I also tried that

我收到错误bash: ${${a}}: bad substitution

答案1

${!parameter}您可以在您的情况下使用参数间接,即${!a}

$ foo1=abc
$ i=1
$ a="foo${i}"
$ echo "${!a}"
abc

来自“参数扩展”部分man bash

${参数}

…………

如果参数的第一个字符是感叹号 (!),则它引入了一级变量间接寻址。 Bash 使用由参数的其余部分形成的变量的值作为变量的名称;然后扩展该变量,并在其余替换中使用该值,而不是参数本身的值。

答案2

您可以使用eval它(它可以与任何 POSIX shell 一起使用,包括 bash):

eval 'echo $'$a

为了显示:

#!/bin/bash -i

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS2='Second prompt \u@\h:\w\$ '
PS3='Third prompt \u@\h:\w\$ '
echo "PS1:$PS1"
for n in 3 2 1
do
        eval 'PS0="$PS'$n'"'
        echo "$PS0"
done

产生(调用脚本“foo”):

$ ./foo
PS1:${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 
Third prompt \u@\h:\w\$ 
Second prompt \u@\h:\w\$ 
${debian_chroot:+($debian_chroot)}\u@\h:\w\$ 

相关内容