在 bash 中,如何延迟字符串中具有动态变量的变量的插值

在 bash 中,如何延迟字符串中具有动态变量的变量的插值

我想知道如何获取包含字符串中变量的字符串变量,以便在每次引用该变量时动态插入所包含的变量。

最好用示例代码来解释这一点。

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

输出是:

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

但期望的输出是:

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

这样做的问题是 VAR1 仅在运行时计算一次,而所需的效果是每次引用它时都对其进行计算。当字符串为VAR1内插功能1,VAR2已经在变量声明处进行了插值,并且为空。

显然,这是一个人为的示例,但不难想象有一个经常更改的变量作为字符串文字的一部分。

我尝试过逃避VAR2as\$VAR2并在字符串文字上使用硬引号VAR1。两者都会产生文字字符串“var1 $VAR2 的字符串

我也尝试过使用评估类似eval "echo "$1 $VAR1"",但这不起作用,并且开始变得难以转义引号。

是的,我知道你可以重构整个事情以使其正常工作。这不是问题的合适答案。

答案1

正如 @DopeGhoti 在评论中所说,变量不是动态的;它们存储静态数据,而不是生成数据的指令。如果您希望每次运行时都会生成不同的数据,请使用一个函数,然后使用以下命令引用它$()

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:"

输出是:

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

答案2

VAR1='string of var1 $VAR2'
function function1()
{
  eval echo \"'$1 $VAR1'\"
}

相关内容