首页 > 解决方案 > 如何编写一个 bash 函数,将 bash 变量添加到带有 jq 的 json 文件中?

问题描述

我想用 jq 将 bash 变量添加到一些 JSON 文件中。以下方法有效:

jq --arg VAR "$VAR" '.+{VAR:$VAR}' my.json > my.tmp.json && mv my.tmp.json my.json

VAR 是一个 bash 变量。但是当我添加许多变量时,我想提取如下函数:

#$1 Variable Name; The entry {"$1": "$($1)"} should be added to my.json
config_add() {
    COMMAND="jq --arg VAR \"\$VAR\" '.+{VAR:\$VAR}' my.json"
    #Replace VAR with the argument
    ${COMMAND//VAR/$1} my.json > my.json.tmp && my.json.tmp my.json
}

但是对于我尝试的任何变体,我都会收到:

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:'.+{MYVAR:$MYVAR}'

任何想法这里发生了什么?如何正确引用它?谢谢!

标签: jsonbashjq

解决方案


如果您想到的策略取决于可以访问全局变量的 bash 函数,那么最好采用替代方法,如下所示:

config_add() {
    local VAR="$1"
    local VALUE="$2"
    jq --arg VAR "$VAR" --arg VALUE "$VALUE" '.+{($VAR): $VALUE}' > my.json.tmp && my.json.tmp my.json 
}

调用示例

x=myvar
myvar=foo

config_add x "$x"

config_add "$x" "${!x}"

作为记录

export x=xyzzy
jq -n --arg a x '{($a): $ENV[$a]}'
{
  "x": "xyzzy"
}

推荐阅读