linux 64位jq不支持在select函数中使用空格扩展的变量

hc8w905p  于 2023-06-29  发布在  Linux
关注(0)|答案(1)|浏览(184)

macos中的OK示例:

jq版本

jq-1.6

代码

a='[{"a":"b"},{"c":"d c"}]'
b="d c"
echo $a|jq '.[]|select(.c == "'$b'")'

输出

{
  "c": "d c"
}

linux下的KO示例:

jq版本

jq-1.5-1-a5b5cbe

代码

a='[{"a":"b"},{"c":"d c"}]'
b="d c"
echo $a|jq '.[]|select(.c == "'$b'")'

输出

jq: error: syntax error, unexpected $end, expecting QQSTRING_TEXT or QQSTRING_INTERP_START or QQSTRING_END (Unix shell quoting issues?) at <top-level>, line 1:
.[]|select(.c == "d
jq: 1 compile error

如上所述,在linux env和macos env之间,jq的select函数中的空格扩展有所不同。我已经尝试在linux环境下下载jq-1.6,但它也产生了像上面的例子在linux KO的问题。linux版本的jq还有bug吗?有没有人能用另一种很好的方法来实现上述功能?我在shell中使用jq来解析数据库信息,获取指定的内容。先谢谢你了!

c86crjj0

c86crjj01#

$b的值中有一个空格。因此,当展开时,jq有两个参数,一个是.[]|select(.c == "d,另一个是c")
如果你想正确地注入带有空格的变量,请引用shell变量:

echo "$a" | jq '.[]|select(.c == "'"$b"'")'

更好的是,不要将数据注入到代码中,使用惯用的方式将字符串导入到jq中,并使用专用的--arg选项:

echo "$a" | jq --arg b "$b"  '.[]|select(.c == $b)'

相关问题