我正在尝试将一个变量传递到 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"
}
}
}
}
迈克尔说这件事的记录很少,他是对的。我在手册中找不到它。我希望这可以帮助别人。