给定以下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)
您的第一个过滤器的执行方式就好像它已像这样加括号一样
echo '{"foo": 1}' | jq '.foo + (2 as $bar | {$bar})'
Run Code Online (Sandbox Code Playgroud)
因此,jq 尝试将一个数字(此处1)添加到一个对象(此处{"bar":2})。
这是因为变量绑定的语法(如手册相应部分中所述)采用以下形式... as $identifier | ...。它“包括”管道和以下表达式。这反映在以下事实:没有以下管道和表达式的绑定不能独立。