如何从 Make 中将文字变量模板传递给 jq?

How do I pass literal variable templates to jq from within Make?

我正在尝试在 Makefile 中使用 jq 来生成 json 文件。这是一个示例 Makefile

foo.json:
    jq -n --arg x "bar" '{"foo": "$$x"}' > foo.json
    @cat foo.json
    @rm foo.json

当我 运行 使用 GNU Make v4.3 和 jq v1.6 时,我得到以下结果

make
jq -n --arg x "bar" '{"foo": "$x"}' > foo.json
{
  "foo": "$x"
}

请注意 $x 按字面显示,并没有被 jq 插入。我如何实现以下...

make
jq -n --arg x "bar" '{"foo": "$x"}' > foo.json
{
  "foo": "bar"
}

您根本不需要将变量用引号引起来:

jq -n --arg x "bar" '{foo: $x}'

或者使用字符串插值:

jq -n --arg x "bar" '{foo: "\($x)"}'

感谢@customcommander 的提示。答案根本不是引用美元符号或 var。更新的 Makefile 确认工作...

$ cat Makefile 
foo.json:
    jq -n --arg x $X '{"foo": $$x}' > foo.json
    @cat foo.json
    @rm foo.json

$ X=123 make
jq -n --arg x 123 '{"foo": $x}' > foo.json
{
  "foo": "123"
}
$ X=456 make
jq -n --arg x 456 '{"foo": $x}' > foo.json
{
  "foo": "456"
}

我最终完全避免了 jq --arg,并采用了 更简单 的方法。

示例生成文件:

# the arg to pass to jq
SOME_VAR?=my-var

foo.json:
    jq -n  '{"foo": "'"$(SOME_VAR)"'"}' > foo.json
    @cat foo.json
    @rm foo.json

用法示例:

$ make foo.json
jq -n  '{"foo": "'"my-var"'"}' > foo.json
{
  "foo": "my-var"
}

带引号的变量也有效:

$ SOME_VAR="hi" make foo.json
jq -n  '{"foo": "'"hi"'"}' > foo.json
{
  "foo": "hi"
}