我正在尝试使用带有--arg参数的jq构建一个json但是我希望json在变量为空时不能有条件。
例如,如果我运行以下命令
jq -n --arg myvar "${SOMEVAR}" '{ $myvar}'
如果myvar恰好为空(因为变量$ {SOMEVAR}不存在)而不是{}
,我希望json在这种情况下为{ "myvar": "" }
只需运行上面的命令。
有没有办法通过某种条件实现这一目标?
更新:
有关用例的更多详细信息
我想基于几个环境变量构建一个json,但只包含具有值的变量。
像
这样的东西 {"varA": "value", "varB": "value"}
但是如果定义了值,则仅包括varA,依此类推。现在的问题是,如果未定义值,则属性varA
仍将存在空值,并且由于多个参数/变量性质,使用if / else按照建议构建整个json将导致为不存在的每个可能变量组合覆盖的大量条件
答案 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选项?