jq变量赋值报错:为何尝试将数字与对象执行add操作?
jq表达式优先级导致的加法错误解析
问题重现
原始执行的命令:
echo '{"foo": 1}' | jq '.foo + 2 as $bar | {$bar}'
预期输出:
{ "bar": 3 }
实际得到错误:
jq: error (at <stdin>:1): number (1) and object ({"bar":2}) cannot be added
添加括号后可正常运行:
echo '{"foo": 1}' | jq '(.foo + 2) as $bar | {$bar}'
输出结果:
{ "bar": 3 }
错误原因
核心是jq的运算符优先级:as的优先级高于+,原始语句的执行顺序和你预想的完全不同。
原始语句.foo + 2 as $bar | {$bar}会被jq解析成:
.foo + (2 as $bar | {$bar})
执行步骤:
- 先处理括号内部分:把数字2赋值给变量
$bar,再用{$bar}生成对象{"bar":2} - 尝试把
.foo的值(1)和这个对象做加法运算 - jq不支持数字与对象相加,因此抛出错误
修正原理
添加括号(.foo + 2) as $bar后,强制让加法运算优先执行:
- 先计算
.foo + 2得到数字3 - 把3赋值给变量
$bar - 最后用
{$bar}生成包含bar:3的对象,得到预期结果
内容的提问来源于stack exchange,提问作者johnsyweb
相关产品推荐
相关产品推荐

