为什么“jq”试图在变量赋值中“添加”到一个对象?

Joh*_*web 3 sh jq

给定以下表达式管道:

echo '{"foo": 1}' | jq '.foo + 2 as $bar | {$bar}'
Run Code Online (Sandbox Code Playgroud)

我期望输出:

{
  "bar": 3
}
Run Code Online (Sandbox Code Playgroud)

我得到的是:

jq: error (at <stdin>:1): number (1) and object ({"bar":2}) cannot be added
Run Code Online (Sandbox Code Playgroud)

这个对象是什么以及为什么要jq尝试add它?

我可以用括号解决这个问题,但我仍然不清楚原始声明中发生了什么:

echo '{"foo": 1}' | jq '(.foo + 2) as $bar | {$bar}' 
{
  "bar": 3
}
Run Code Online (Sandbox Code Playgroud)

pmf*_*pmf 6

您的第一个过滤器的执行方式就好像它已像这样加括号一样

echo '{"foo": 1}' | jq '.foo + (2 as $bar | {$bar})'
Run Code Online (Sandbox Code Playgroud)

因此,jq 尝试将一个数字(此处1)添加到一个对象(此处{"bar":2})。

这是因为变量绑定的语法(如手册相应部分中所述)采用以下形式... as $identifier | ...。它“包括”管道和以下表达式。这反映在以下事实:没有以下管道和表达式的绑定不能独立。