2017-01-16 3 views
1

Я пытаюсь построить json с jq с аргументами --arg, но я бы хотел, чтобы json не мог иметь условие, если переменная пуста.Условные переменные в JQ json в зависимости от значения аргумента?

Пример, если я запускаю следующую команду

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

Я хотел бы в этом JSON случае быть {} если MyVar оказывается пустыми (Так как переменные $ {SOMEVAR} не существует) а не { "myvar": "" }, что я получаю, просто выполнив команду выше.

Есть ли способ достичь этого через какое-то условие?

UPDATE:

Некоторые подробности о прецеденте

Я хочу построить JSON на основе нескольких переменных окружения, но включают в себя только переменные, которые имеют значение.

Что-то вроде

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

Но только включают Vara, если ее значение определяется и так далее. Проблема заключается в том, что если значение не определено, свойство varA будет по-прежнему существовать с пустым значением и из-за множественного характера аргумента/переменной, используя if/else для построения всего json, как было предложено, это приведет к огромному количеству условия для покрытия всех возможных комбинаций переменных не существующих

+0

Двойная кавычка * не * то же самое, что и две одинарные кавычки – hek2mgl

+0

Да, я хорошо знаю, однако я был ограничен только одним типом цитаты, поэтому мне пришлось написать его таким образом. Он работает так же хорошо, как и с двойными кавычками. – ByteFlinger

+1

Нет, это не так. '$ {SOMEVAR}' в настоящее время не используется.Если он содержит пробел, он будет подвержен разбиению слов – hek2mgl

ответ

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"} 
+0

Это было очень хорошее решение. Это дало мне то, что я искал, спасибо. – ByteFlinger

0

вы можете использовать if/else конструкцию:

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

Спасибо, но это было бы слишком сложно, если вы используете несколько аргументов. If/then должен быть за переменную внутри json, а не для всего. Это единственный способ? – ByteFlinger

+0

По крайней мере, единственный способ, о котором я знаю. – hek2mgl

+2

1. Если вам действительно нужно использовать несколько параметров --arg (что, я сомневаюсь, это так), вы можете добавить подходящий def, например. jq -n -c -arg myvar foo 'def z: если length> 0, то {(.):. } else {} end; $ myvar | z '2. Задумывались ли вы об альтернативных подходах, которые не требовали бы нескольких параметров командной строки? Это может помочь описать проблему, которую вы действительно пытаетесь решить. – peak

0

Это до сих пор не ясно, где переменной v аэродромные пары, поэтому, возможно, было бы проще построить объект, содержащий сопоставление, перед вызовом jq, а затем передать его с использованием опции -argjson или -argfile?

Смежные вопросы