【问题标题】:jq json path single quotes and variable [duplicate]jq json路径单引号和变量[重复]
【发布时间】:2019-01-14 15:51:39
【问题描述】:

试图找出 jq 的语法。 这条线工作得很好:

echo $(cat ../post-auth/rkt-auth.json | jq -c --arg user ${vsphere_user} '.credentials.user = $user') > ../post-auth/rkt-auth.json

但是,当变量是 json 路径的一部分时,情况并非如此:

echo $(cat ../post-auth/docker-auth.json | jq -c --arg basejq ${base} --arg tempvarjq ${tempvar} '.auths.$tempvarjq.auth= $basejq') > ../post-auth/docker-auth.json

错误:

jq: error: syntax error, unexpected '$', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.auths.$tempvarjq.auth= $basejq       
jq: 1 compile error

任何建议如何使用该变量更正此语法?

【问题讨论】:

  • 这是useless use of echouseless cat 顺便说一句。
  • 另外,如果您的输入文件与输出文件相同,则为bound to cause some issues
  • echo "$(cat file)" &gt;file 不能保证在写入之前完成所有读取。许多 shell 在运行重定向之前运行命令替换,但这并不是 POSIX 标准的可靠保证,不应依赖它。 (此外,即使您的 shell 确实 遵循该操作顺序,这意味着失败的 cat 运行仍将调用 echo,因此您的文件将被空白而不是单独留在发生错误)。

标签: json bash jq


【解决方案1】:

试试这个。

jq -c --arg basejq "${base}" \
    --arg tempvarjq "${tempvar}" \
    '.auths[$tempvarjq].auth= $basejq' \
    ../post-auth/docker-auth.json \
        > ../post-auth/docker-auth.json.tmp &&
mv  ../post-auth/docker-auth.json.tmp  \
    ../post-auth/docker-auth.json

【讨论】:

  • 不在我可以测试的地方 - 如果它不起作用,我会简单地删除它。
  • 它成功了,谢谢,如果这是一个重复,我无法从其他帖子中拼凑起来,现在有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2017-09-06
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多