【问题标题】:To be assigned value as variable in jq [duplicate]在jq中作为变量赋值[重复]
【发布时间】:2018-05-18 05:16:50
【问题描述】:

json processor jq 用于 package.json

{
  "someparent" : {
    "somechild" : "oldvalue"
  }
}

如果我运行以下命令(将oldvalue 更改为somevalue):

jq '.someparent["somechild"] = "somevalue" "$aDirection/package.json"'

已成功更改。但是,如果我给出一个变量而不是 someValue:

 aVar="anotherValue"
 jq '.someparent["somechild"] = "$aVar" "$aDirection/package.json"'

它不工作。 我已经尝试过的:

["aVar"] #interpreted as string
["$aVar"] #interpreted as string
"$aVar" # aVar is not defined
$avar #aVar is not defined

【问题讨论】:

  • 我看过那个问题,但他们的答案不适合这种情况,也不起作用(例如\"aVar\"
  • @BenjaminW。对于专家用户来说,这个问题可以看作是重复的,但绝对不适合初学者、qua 类型、qua 解决方案和处理方法。 ps:正如你所说,json只是简化问题。

标签: json bash jq


【解决方案1】:

jq 过滤器周围的单引号位置错误。在您的尝试中,它还包含了实际的 JSON 文件输入。对文件应用过滤器时的正确语法是

jq '<filter>' json-file

在你的情况下,正确的过滤器只是

.someparent["somechild"] = $aVar

要在jq 中使用shell 变量,您需要使用--arg 字段。将两个选项放在一起。 --arg 之后的第一个变量在 jq 的上下文中使用,后面的一个是实际的 shell 变量。

aVar="anotherValue"
jq --arg aVar "$aVar" '.someparent["somechild"] = $aVar' "$aDirection/package.json"
#                                                    ^^^^ Remember the single quote 
#                                                    terminating here and not extended

【讨论】:

    【解决方案2】:

    明确一点:使用 OP 的方法可以工作,例如

    jq '.someparent["somechild"] = "'"$aVar"'"' "$aDirection/package.json"
    

    但是使用--arg(用于字符串)和/或--argjson要好得多。环境变量的另一个选项是使用 jq 函数env

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2017-07-01
      • 2013-09-13
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多