我想知道如何获取包含字符串中变量的字符串变量,以便在每次引用该变量时动态插入所包含的变量。
最好用示例代码来解释这一点。
#!/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'\"
}