我正在尝试在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
的滤波器表达式得到两个字Wisozk
和Inc
,而不是"Wisozk Inc"
。
只需使用--arg
字段将变量传递到jq
的上下文中,然后让它处理它
jq --arg k supplier --arg v "Wisozk Inc" 'map(select(.[$k] == $v))' json
此问题与以下两个问题部分重复,但不是整体。
- 将参数传递到jq筛选器
- 将bash变量传递给jq