我有这个jq过滤器:
some_command | jq -r '.elements[] | select(.state=="LIVE" and .group == "some_text" and .someFlag == false) | .name'
Run Code Online (Sandbox Code Playgroud)
someFlag是可选字段。因此,当它不存在时,表达式不会显示任何结果。我想检查:
false值时才通过检查false我怎样才能做到这一点?
我使用了替代运算符//:
(.someFlag // false) == false)\nRun Code Online (Sandbox Code Playgroud)\n\n因此,如果.someFlag不存在,则被视为错误。
整个表达式是:
\n\nsome_command | jq -r \'.elements[] | select(.state=="LIVE" and .group == "some_text" and (.someFlag // false) == false)) | .name\'\nRun Code Online (Sandbox Code Playgroud)\n\n来自jq文档:
\n\n替代运算符 // :
\n\n如果 a 生成除 false 和 null 之外的结果,则该形式的过滤器
\n\na // b\n 会生成与 相同的结果。\n 否则,会生成与 相同的结果。aa // bb这对于提供默认值很有用:如果输入中
\n.foo // 1没有元素,则计算结果为 1 。.foo它\xe2\x80\x99s 类似于有时在Python 中使用or 的方式(jq\xe2\x80\x99s 或运算符保留用于严格\n 布尔运算)。
在给定的上下文中,直接翻译为:
- 如果存在 someFlag,则仅当其值为 false 时才通过检查
- 如果 someFlag 不存在,则将其视为 false
jq 为:
if has("someflag") then .someflag == false else false end
Run Code Online (Sandbox Code Playgroud)
.elements[]
| select(.state == "LIVE"
and .group == "some_text"
and (if has("someFlag")
then .someFlag == false
else false
end))
| .name
Run Code Online (Sandbox Code Playgroud)
[此回复已根据问题的更新进行更新。]