尝试将键和值都传递给jq筛选器表达式时出错



我正在尝试在bash脚本中使用jq查询json

customer.json文件包含以下

[
{
"_id": "5968dd23fc13ae04d9000001",
"product_name": "sildenafil citrate",
"supplier": "Wisozk Inc",
"quantity": 262,
"unit_cost": "$1047"
},
{
"_id": "5968dd23fc13ae04d9000002",
"product_name": "Mountain Juniperus ashei",
"supplier": "Keebler-Hilpert",
"quantity": 292,
"unit_cost": "$874"
},
{
"_id": "5968dd23fc13ae04d9000003",
"product_name": "Dextromathorphan HBr",
"supplier": "Schmitt-Weissnat",
"quantity": 211,
"unit_cost": "$2053"
}
]

当我运行以下bash脚本时

key="supplier"
value="Wisozk Inc"
jq ".[] | select(.$key==$value)" customers.json

它抛出以下错误

jq: error: syntax error, unexpected IDENT, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select(.supplier == Wisozk Inc)
jq: 1 compile error

我认为";Wisozk";以及";Inc公司";是问题所在,该怎么办?

不要在jq中用双引号插入shell变量。该错误是由于值字段中的空格,变量$value通过进行分词,并且jq的滤波器表达式得到两个字WisozkInc,而不是"Wisozk Inc"

只需使用--arg字段将变量传递到jq的上下文中,然后让它处理它

jq --arg k supplier --arg v "Wisozk Inc" 'map(select(.[$k] == $v))' json

此问题与以下两个问题部分重复,但不是整体。

  • 将参数传递到jq筛选器
  • 将bash变量传递给jq

最新更新