在字符串中进行变量替换

问题描述 投票:-2回答:2

假设我定义了一个json文件:

// foo.json
{"key":"${VALUE}"}

和一个makefile:

export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)

bar:
    @echo "$(foo)"

[问题是:如何通过make的变量替换或${VALUE}的BASH替换来变量扩展echo,以便保留有效JSON文件中的双引号?

makefile gnu-make
2个回答
0
投票

如果运行此Makefile:

export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell cat foo.json)

bar:
    $(warning $(foo))

您可以看到$(foo)确实包含双引号。但是$ VALUE不会扩展。

您可以尝试这个:

export VALUE=bar
SHELL=/usr/bin/env bash
foo=$(shell VALUE=$(VALUE) envsubst < foo.json)

bar:
    @echo '${foo}'

0
投票

如果要在Make的环境中扩展变量,则可以使用eval来扩展赋值内部的变量。

[假设您不介意按照@MadScientists的注释将所有行合并在一起,则可以将注释grep出来,并将json合并为一行,如下所示:

export VALUE:=bar

foo:=$(shell grep -v "^\S*//" foo.json)
$(info foo=[$(foo)])

$(eval foo2:=$(shell grep -v "^\S*//" foo.json))
$(info foo2=[$(foo2)])

bar:
        @echo "from recipe: foo2=[$(subst ",\",$(foo2))]"

$(subst ",\",...)在发送给bash之前转义了引号。输出:

foo=[{"key":"${VALUE}"}]
foo2=[{"key":"bar"}]
from recipe: foo2=[{"key":"bar"}]

注意:出于安全考虑,如果外部人可以访问foo.json,则他们可以使用制造商的特权进行所需的运行。

© www.soinside.com 2019 - 2024. All rights reserved.