JQ json中的条件变量取决于参数值?

时间:2017-01-16 09:51:08

标签: json environment-variables jq

我正在尝试使用带有--arg参数的jq构建一个json但是我希望json在变量为空时不能有条件。

例如,如果我运行以下命令

jq -n --arg myvar "${SOMEVAR}" '{ $myvar}'

如果myvar恰好为空(因为变量$ {SOMEVAR}不存在)而不是{},我希望json在这种情况下为{ "myvar": "" }只需运行上面的命令。

有没有办法通过某种条件实现这一目标?

更新:

有关用例的更多详细信息

我想基于几个环境变量构建一个json,但只包含具有值的变量。

这样的东西

{"varA": "value", "varB": "value"}

但是如果定义了值,则仅包括varA,依此类推。现在的问题是,如果未定义值,则属性varA仍将存在空值,并且由于多个参数/变量性质,使用if / else按照建议构建整个json将导致为不存在的每个可能变量组合覆盖的大量条件

3 个答案:

答案 0 :(得分:1)

假设您有一个变量名模板,以您建议的方式提供对象的形式:

{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"}

答案 1 :(得分:0)

您可以使用if/else构造:

jq -n --arg myvar "${SOMEVAR}" 'if ($myvar|length > 0) then {$myvar} else {} end'

答案 2 :(得分:0)

它仍然不清楚变量值对的来源,所以在调用jq之前构造包含映射的对象,然后使用--argjson或 - 传递它可能是最简单的-argfile选项?