Bash: Echo uma variável cujo nome é o valor de outra variável [duplicado]

1

Suponha que eu tenha o seguinte:

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

Estou recebendo o erro bash: ${${a}}: bad substitution .

    
por Srathi00 16.03.2016 / 09:42

2 respostas

3

Você pode usar o parâmetro indireto ${!parameter} , ou seja, no seu caso, ${!a} :

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

Da seção "Expansão de parâmetro" de man bash :

${parameter}

.......

If the first character of parameter is an exclamation point (!), it introduces a level of variable indirection. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself.

    
por 16.03.2016 / 09:58
1

Você pode usar eval para isso (e funcionaria com qualquer shell POSIX, incluindo bash):

eval 'echo $'$a

Para ilustrar:

#!/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

produz (chame o script "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\$ 
    
por 16.03.2016 / 09:46