JQ json 中的条件变量取决于参数值?
Conditional variables in JQ json depending on argument value?
我正在尝试使用带有 --arg 参数的 jq 构建一个 json,但是我希望 json 在变量为空时不能有条件。
举个例子,如果我运行下面的命令
jq -n --arg myvar "${SOMEVAR}" '{ $myvar}'
如果 myvar 恰好为空(因为变量 ${SOMEVAR} 不存在)而不是 { "myvar": "" }
,我希望 json 在这种情况下为 {}
这是我通过 运行ning 上面的命令得到的结果。
有什么办法可以通过某种条件来实现吗?
更新:
有关用例的更多详细信息
我想构建一个基于多个环境变量的 json,但只包含有值的变量。
类似
{"varA": "value", "varB": "value"}
但只有在定义了 varA 的值时才包括它等等。现在的问题是,如果未定义值,属性 varA
仍将存在空值,并且由于多重 argument/variable 性质,使用 if/else 构建建议的整个 json 将产生大量条件,以涵盖不存在的所有可能的变量组合
您可以使用 if/else
结构:
jq -n --arg myvar "${SOMEVAR}" 'if ($myvar|length > 0) then {$myvar} else {} end'
假设您有一个变量名模板,按照您的建议以对象的形式出现:
{a, b, c}
还假设(为了便于说明)您想要从 *ix 环境变量中提取相应的值。然后你只需要调整模板,这可以使用这个过滤器来完成:
def adjust: with_entries( env[.key] as $v | select($v != null) | .value = $v );
示例:
假设上面的过滤器连同下面的行在一个名为 adjust.jq:
的文件中
{a,b,c} | adjust
然后:
$ export a=123
$ jq -n -f -c adjust.jq
{"a":"123"}
目前还不清楚 variable-value 对来自哪里,所以可能最简单的方法是在调用 jq 之前构造包含映射的对象,然后使用 --argjson 或 - -argfile 选项?
我正在尝试使用带有 --arg 参数的 jq 构建一个 json,但是我希望 json 在变量为空时不能有条件。
举个例子,如果我运行下面的命令
jq -n --arg myvar "${SOMEVAR}" '{ $myvar}'
如果 myvar 恰好为空(因为变量 ${SOMEVAR} 不存在)而不是 { "myvar": "" }
,我希望 json 在这种情况下为 {}
这是我通过 运行ning 上面的命令得到的结果。
有什么办法可以通过某种条件来实现吗?
更新:
有关用例的更多详细信息
我想构建一个基于多个环境变量的 json,但只包含有值的变量。
类似
{"varA": "value", "varB": "value"}
但只有在定义了 varA 的值时才包括它等等。现在的问题是,如果未定义值,属性 varA
仍将存在空值,并且由于多重 argument/variable 性质,使用 if/else 构建建议的整个 json 将产生大量条件,以涵盖不存在的所有可能的变量组合
您可以使用 if/else
结构:
jq -n --arg myvar "${SOMEVAR}" 'if ($myvar|length > 0) then {$myvar} else {} end'
假设您有一个变量名模板,按照您的建议以对象的形式出现:
{a, b, c}
还假设(为了便于说明)您想要从 *ix 环境变量中提取相应的值。然后你只需要调整模板,这可以使用这个过滤器来完成:
def adjust: with_entries( env[.key] as $v | select($v != null) | .value = $v );
示例:
假设上面的过滤器连同下面的行在一个名为 adjust.jq:
的文件中 {a,b,c} | adjust
然后:
$ export a=123
$ jq -n -f -c adjust.jq
{"a":"123"}
目前还不清楚 variable-value 对来自哪里,所以可能最简单的方法是在调用 jq 之前构造包含映射的对象,然后使用 --argjson 或 - -argfile 选项?