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)虽有细节差异,但本质都是变量展开时的空格引发的参数拆分问题。
推荐的两种解决方法:
使用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的分词逻辑。调整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
相关产品推荐
相关产品推荐

