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
相关产品推荐
相关产品推荐

