繁体   English   中英

在字符串中进行变量替换

[英]Make variable substitution in string

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

foo.json

{"key":"${VALUE}"}

makefile:

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

bar:
    @echo "$(foo)"

问题是:我如何通过 make 的变量替换或echo的 BASH 替换来扩展${VALUE}变量,以便有效 JSON 文件中的双引号保留在Z50A87F0D71F7221582和 yesfoo 上, echo $(foo)还评估变量-但删除双引号-是的,我不关心换行符被删除)?

至于这一切的原因,假设我有一个例程需要一个表达 JSON 文件,该文件相当于一种语言(而不是配置),并且我正在使用 Make 来控制系统:

.PHONY: generator

# in the language of control theory
generator: $(foreach q,${Qm},.Qmarked-startup-$q)
    application $@ -i <(pseudo code: {envsubst $@.json})

.Qmarked-startup-%: $(pseudo code: q0 dependencies ... )
    # $* here is a verb
    application $* -i <(pseudo code: {envsubst $*.json})

如果你想从 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,那么他们可以使用制造商的权限让 make 运行任何他们想要的东西。

如果你运行这个 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}'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM