No bash, como atrasar a interpolação de uma variável que tenha uma variável dinâmica dentro de sua string

1

Eu quero saber como obter uma variável de string contendo uma variável na string para interpolar a variável contida dinamicamente - cada vez que ela é referenciada.

Isso é melhor explicado com código de exemplo.

#!/bin/bash
VAR1="string of var1 $VAR2"

function function1()
{
  echo "$1 $VAR1"
}

function function2()
{
  VAR2="$1"
}

function2 1000

function1 "example 1:"

function2 2000

function1 "example 2:"

A saída é:

example 1: string of var1
example 2: string of var1

Mas a saída desejada é:

example 1: string of var1 1000
example 2: string of var1 2000

O problema com isso é que VAR1 é avaliado apenas uma vez em tempo de execução, quando o efeito desejado seria para ser avaliado sempre que fosse referenciado. Quando a string VAR1 é interpolada dentro de function1 , VAR2 já terá sido interpolada na declaração da variável, e estará vazia.

Obviamente, este é um exemplo artificial, mas não é difícil imaginar uma variável que muda frequentemente como parte de uma string literal.

Eu tentei escapar de VAR2 como \$VAR2 e usar aspas duras na string literal de VAR1 . Ambos resultam na string literal " string de var1 $ VAR2 "

Eu também tentei usar eval como eval "echo "$1 $VAR1"" , mas isso não funciona e começa a ficar difícil de escapar das aspas.

Sim, sei que você pode refatorar tudo para que funcione. Essa não é uma resposta adequada para o problema.

    
por typedeaf 07.08.2017 / 21:35

2 respostas

3

Como disse @DopeGhoti em um comentário, as variáveis não são dinâmicas; eles armazenam dados estáticos, não instruções para gerar dados. Se você quiser algo que produza dados diferentes toda vez que for executado, use uma função e, em seguida, faça referência a ela com $() :

dynamic_thing()
{
    echo "string of dynamic_thing $VAR2"
}

function function1()
{
  echo "$1 $(dynamic_thing)"
}

function function2()
{
  VAR2="$1"
}

function2 1000

function1 "example 1:"

function2 2000

function1 "example 2:"

A saída é:

example 1: string of dynamic_thing 1000
example 2: string of dynamic_thing 2000
    
por 07.08.2017 / 23:44
0
VAR1='string of var1 $VAR2'
function function1()
{
  eval echo \"'$1 $VAR1'\"
}
    
por 08.08.2017 / 02:37

Tags