将变量传递给 jq 以编辑 json 文件

将变量传递给 jq 以编辑 json 文件

我正在尝试将一个变量传递到 jq 中,'.Linux.date.$var'到目前为止我已经尝试按名称引用它们,效果很好。但我想使用变量来调用它们。

我有这个,运行良好

exectime=$(date -d now);    
cp $check_exec_history $check_exec_history.tmp
    jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.first = $key1 | .Linux.date_executed.first = $key2' $check_exec_history.tmp > $check_exec_history; 
    rm $check_exec_history.tmp;

我想做到这一点,但没有工作:

name=first;
exectime=$(date -d now);
cp $check_exec_history $check_exec_history.tmp
jq --arg key1 true --arg key2 "$exectime" --arg name "$name" ".Linux.script_executed.$name = $key1 | .Linux.date_executed.$name = $key2" $check_exec_history.tmp > $check_exec_history; 
rm $check_exec_history.tmp;

我走了这么远:使用这个答案https://stackoverflow.com/q/40027395/9496100但我不确定我在哪里做错了。

name=first;
exectime=$(date -d now);    
cp $check_exec_history $check_exec_history.tmp
    jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.name==$name = $key1 | .Linux.date_executed.name==$name = $key2' $check_exec_history.tmp > $check_exec_history; rm $check_exec_history.tmp;

答案1

您可以对 jq 中的所有对象使用方括号索引,因此[$name]适用于您正在尝试的内容:

jq --arg key1 true --arg name "$name" '.Linux.script_executed[$name] = $key1 ...' 

方括号的使用没有很好的记录在手册中,这使得它看起来只能使用.[xyz], 但只要它不在表达式的开头(即和相同,但是一个数组构造),它就可以["x"]在任何地方使用。.x.a.x.a["x"]["x"]

注意使用单身的上面的引号 - 这样 Bash 就不会尝试将$name和解释$key1为 shell 变量。你应该保留双引号--arg name "$name",因为那真的一个 shell 变量,应该用引号引起来以使其可以安全使用。

答案2

迈克尔·霍默的回答是正确的。我将发布与操作问题相关的我的目标。

我正在尝试修改通过 REST API curl 调用获得的权限图,用于jq输出 json 文件,我将其PUT更新到服务器。以下是curl API查询的输出:

{
  "revision": 2,
  "groups": {
    "1": {
      "1": {
        "native": "none",
        "schemas": "none"
      },
      "2": {
        "native": "write",
        "schemas": "all"
      }
    },
    "2": {
      "1": {
        "native": "write",
        "schemas": "all"
      },
      "2": {
        "native": "write",
        "schemas": "all"
      }
    }
  }
}

正如你所看到的,它是嵌套的。每次创建新的权限集和创建数据库时,我都尝试使用 bash 变量来修改它。例如,我正在尝试修改groups."1"."2"."native"“模式”"groups."2"."2".native和“模式”值。虽然比较粗糙,但是关键如下groups.groupPermissionID.DatabaseID.*

为了通过 bash shell 脚本动态修改这个嵌套图,我使用了 Michael Homer 的应用解决方案[$name]。就我而言,我必须连续这样做两次。 IE,[$gID][$dID]。在以下设置中,变量是常量,但在我的模型中,它们是传递给 bash shell 脚本的命令参数。

dbID="2"
pgroupID="2"

curl -X GET -H "Content-Type: application/json" -H "X-Metabase-Session: XXXXX-XXXXX-XXXXX-XXXXXXXXX" "http://localhost:9000/api/permissions/graph" | jq --arg dID "$dbID"   --arg gID "$pgroupID" -r '.groups."1"[$dID]."native" = "none" | .groups."1" [$dID]."schemas" = "none" | .groups[$gID][$dID]."native" ="none" .groups[$gID][$dID]."schemas" ="none"' > permissiongraph.json

它生成了以下更新的 JSON 图表供我发送PUT到我的服务器:

{
  "revision": 2,
  "groups": {
    "1": {
      "1": {
        "native": "none",
        "schemas": "none"
      },
      "2": {
        "native": "none",
        "schemas": "none"
      }
    },
    "2": {
      "1": {
        "native": "write",
        "schemas": "all"
      },
      "2": {
        "native": "none",
        "schemas": "none"
      }
    }
  }
}

迈克尔说这件事的记录很少,他是对的。我在手册中找不到它。我希望这可以帮助别人。

相关内容