簡體   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