You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zsh中如何将变量传入jq命令?

问题:jq使用shell变量匹配失败的解决办法

当传入常量时,jq指令可正常运行:

westk@westkent:~$ echo $dat | jq -r '.[] | select(.Name == "ADM111_1")'
{
  "ID": 300035,
  "ProductModelName": "Color LaserJet CP3525dn",
  "SupplierName": "HP",
  "StatusName": "In Use",
  "Name": "ADM111_1",
  "ModifiedDate": "2021-06-23T15:56:06.017Z",
  "ExternalID": "",
  "IP": "18.66.0.26"
}

但传入shell变量时,多种写法均报错:

westk@westkent:~$ pn="ADM111_1"
westk@westkent:~$ echo $dat | jq -r '.[] | select(.Name == ${pn})'
jq: error: syntax error, unexpected '{', expecting IDENT or __loc__ (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select(.Name == ${pn})                       
jq: 1 compile error
westk@westkent:~$ echo $dat | jq -r '.[] | select(.Name == $pn)'
jq: error: $pn is not defined at <top-level>, line 1:
.[] | select(.Name == $pn)                      
jq: 1 compile error

尝试过== $(pn)、== $($(pn))、== ${${pn}}、== "\"$pn\""等写法,均无法正常运行,求正确语法。


解决方法

方法一:使用jq的--arg参数传递变量(推荐)

这是jq官方推荐的传递外部变量的方式,能彻底避免shell引号转义问题:

pn="ADM111_1"
echo $dat | jq -r --arg target_name "$pn" '.[] | select(.Name == $target_name)'

--arg会将shell变量pn的值赋值给jq内部的target_name变量,在jq表达式中直接用$target_name引用即可,无需处理引号。

方法二:shell变量直接插值

如果不想用--arg,可以通过shell变量插值将变量值直接嵌入jq表达式,但要注意引号的嵌套:

pn="ADM111_1"
echo $dat | jq -r '.[] | select(.Name == "'"$pn"'")'

shell会先解析'"$pn"'为"ADM111_1",最终jq收到的表达式和常量写法完全一致,自然能正常运行。


内容的提问来源于stack exchange,提问作者DebianFanatic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:10:21