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

Yay*_*uan 1 linux bash x86-64 jq

macOS 中的示例正常:

jq版

jq-1.6
Run Code Online (Sandbox Code Playgroud)

代码

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

输出

{
  "c": "d c"
}
Run Code Online (Sandbox Code Playgroud)

Linux 中的 KO 示例:

jq版

jq-1.5-1-a5b5cbe
Run Code Online (Sandbox Code Playgroud)

代码

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

输出

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
Run Code Online (Sandbox Code Playgroud)

如上,linux环境和macos环境下jq的select函数中的空格扩展是有区别的。我已经尝试在linux环境中下载jq-1.6,但它也产生了像上面的linux示例KO一样的问题。linux版本的jq还存在bug吗?有人能以另一种很好的方式来实现上述功能吗?我在 shell 中使用 jq 来解析数据库信息并获取指定内容...提前致谢!

pmf*_*pmf 5

的值中有一个空格$b。因此,当展开时,您最终会得到 jq 的两个参数,一个是.[]|select(.c == "d,另一个是c")

如果您想正确地用空格注入变量,请引用 shell 变量:

echo "$a" | jq '.[]|select(.c == "'"$b"'")'
Run Code Online (Sandbox Code Playgroud)

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

echo "$a" | jq '.[]|select(.c == "'"$b"'")'
Run Code Online (Sandbox Code Playgroud)