Как добавить динамический объект JSON в JQ Bash - PullRequest
1 голос
/ 18 октября 2019

Мне нужно добавить динамический объект JSON в соответствии с аргументами, передаваемыми с помощью bash. В настоящее время я умею генерировать объект динамических таблиц, но при выводе он добавляется в виде строки. Пожалуйста, помогите мне. bash demo.bash sarika@gmail.com abc demo h У меня есть код:

Tables=$(  for i in "${@:3}"; do
                jq -n \
                  --arg tn $i \
                  '{"table_name":$tn}'
                done )

echo $Tables |jq '.'
tab=$( echo $Tables |jq '.'  )
# tab= $Tables |jq '.'

JSON_STRING=$( jq -n \
                  --arg gb "$VALUE" \
                  --arg tables "$tab" \
                  '{"email":$gb,"tables":[($tables)]}'\
                  )

Вывод, который он выдает:

{
  "email": "sarika@gmail.com",
  "tables": [
    "{\n \"table_name\": \"demo\",\n}\n{\n \"table_name\": \"h\",\n}"
  ]
}

Мне нужен результат как:

{
  "email": "sarika@gmail.com",
  "tables": [
    {
      "table_name": "table1"
    },
    {
      "table_name": "table2"
    }
  ]
}

1 Ответ

0 голосов
/ 18 октября 2019

Кажется, вы ищете это:

tables=$(for i in "${@:3}"; do jq -n --arg tn "$i" '{"table_name": $tn}'; done | jq -s .)

jq -n \
    --arg gb "$VALUE" \
    --argjson tables "$tables" \
    '{"email": $gb, "tables": $tables}'

Что было не так, и как я это исправил:

  • jq в первом цикле дает JSONобъекты вида {"table_name": $tn}. Чтобы сформировать массив JSON из этих объектов, с надлежащим разделителем , между объектами, вам нужно передать эти объекты через jq -s .
  • Чтобы передать объект JSON в качестве аргумента, используйте --argjson вместо --arg
  • Чтобы встроить массив JSON $tables, напишите "tables": $tables вместо "tables": [$tables], что создаст ненужный массив
  • Это не было ошибкой, но очень плохая привычкане использовать двойные кавычки, используемые в качестве аргументов командной строки
...