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

Linux 64位jq中select函数含空格变量展开异常问题求助

问题场景

macOS下运行正常示例

jq版本

jq-1.6

代码

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

输出

{
  "c": "d c"
}

Linux下运行失败示例

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

如上所示,jq的select函数处理含空格变量展开时,Linux与macOS环境存在差异。已在Linux环境尝试jq-1.6版本,但仍出现上述报错。请问这是Linux版jq的bug吗?是否有更优方法实现该功能?我正用jq在shell中解析数据库信息以获取指定内容……


解答

这不是Linux版jq的bug,问题核心在于shell的变量展开与分词规则。当b="d c"被直接嵌入jq脚本时,原命令会被shell拆分为jq '.[]|select(.c == "d' 'c")'——空格导致jq收到的参数被分割成两部分,自然触发语法错误。不同系统的shell(比如macOS默认bash 3.x、Linux常见bash 4+或dash)虽有细节差异,但本质都是变量展开时的空格引发的参数拆分问题。

推荐的两种解决方法:

  1. 使用jq官方推荐的--arg参数传递变量(最稳妥)
    这种方式能彻底避开shell引号陷阱,完美处理含空格、特殊字符的变量:

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

    原理:--arg target "$b"会将shell变量b的值安全传入jq,在jq脚本中通过$target引用,完全隔离shell的分词逻辑。

  2. 调整shell引号包裹方式
    若不想用--arg,可将整个jq脚本用双引号包裹,同时转义内部双引号:

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

    注意:此处建议用echo "$a"替代echo $a,避免shell对变量内的空格、引号做意外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:13:22