sobre cifrão: cifrão em cifrão?

1

Iniciante aqui. suponha que temos:

echo $A
abc

echo $B
def

echo $abcdef
yesyes

Como obtenho "yesyes" usando A e B? Eu estava tentando algo como:

${$A$B}        
$'echo "$A"$B'

mas falhou. Qualquer conselho?

    
por user297997 03.07.2018 / 01:53

2 respostas

2

Se você estiver usando o shell Bash, se você introduzir uma variável intermediária, poderá usar indirection :

$ echo $A
abc
$ echo $B
def
$ echo $abcdef
yesyes

então

$ AB=$A$B
$ echo "${!AB}"
yesyes

Indireta de variável é descrita na seção ** Expansão de Parâmetro * do manual de Bash ( man bash ):

   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.   This  is
   known as indirect expansion.  The exceptions to this are the expansions
   of ${!prefix*} and ${!name[@]} described below.  The exclamation  point
   must  immediately  follow the left brace in order to introduce indirec‐
   tion.
    
por 03.07.2018 / 02:15
0

Você pode fazer assim:

$ eval "echo \$$(echo ${A}${B})"
yesyes

O acima é da forma geral, eval "echo \$$(echo ...) . O acima converte as variáveis, ${A}${B} na string abcdef , e então eval's como echo \$abcdef .

Se você retirar o eval , poderá ver o formulário intermediário:

$ echo \$$(echo ${A}${B})
$abcdef

O eval está expandindo a variável $abcdef .

Referências

por 03.07.2018 / 02:07

Tags