создание вложенного файла json из переменных с помощью jq

Как сказал Муру, Вы можете изменить его, как показано ниже.

[Unit]
Description=b service
After=a.service

[Service]
Type=simple

#restart on failure and tries 5 times. If fail in all, then reboot the system
ExecStartPre=/usr/bin/python /home/pi/.clar/c.py
ExecStart=/usr/bin/python /home/pi/.clar/b.py
Restart=on-failure
RestartSec=15
StartLimitBurst=5
StartLimitInterval=2min
StartLimitAction=reboot

[Install]
WantedBy=a.service

Затем вам нужно выполнить sudo systemctl disable b.serviceиsudo systemctl enable b.service

0
08.11.2021, 16:33
4 ответа

Я бы сделал это в 2 шага:(РЕДАКТИРОВАТЬ :артефакты — это массив объектов)

inner=$(jq -n --arg name oer \
              --arg version "$ot" \
              '$ARGS.named'
)
final=$(jq -n --arg configId "$configid" \
              --arg objectname "tempfile" \
              --arg test "2021" \
              --argjson artifacts "[$inner]" \
              '$ARGS.named'
)
echo "$final"
{
  "configId": "c8f",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],  "test": "2021"
}

Добавьте -c, если вы хотите, чтобы окончательный вывод состоял из одной строки.


3
08.11.2021, 21:49

Вы не получаете вывод, так как сохраняете вывод в переменной, поэтому нет ничего, что можно было бы перенаправить в файл. Вы можете сделать это:

variable=$(command)

или это:

command > file

Но вы не можете сделать variable=$(command) > file, потому что нечего перенаправлять. Таким образом, несмотря на то, что описанное выше будет выполнено и создаст и/или перезапишет file, файл всегда будет пустым, поскольку вы уже сохранили вывод команды в переменной.

Таким образом, если вы оба хотите получить вывод в переменной и сохранить его в файл, вам понадобится что-то вроде этого:

JSON_STRING=$(jq -n \
                  --arg configId "$configid" \
                  --arg objectname "tempfile" \
                  --arg artifacts "[{ "name" : "oer", "version" : "$ot" }]" \
                  --arg test "2021" \
                   '$ARGS.named')
printf '%s\n' "$JSON_STRING" > output.json
1
08.11.2021, 16:58

Кажется, вы хотите, чтобы artifactsрассматривался как массив JSON. В этом случае используйте --argjsonвместо --argи исправьте кавычки:

jq -n \
  --arg configId "$configid" \
  --arg objectname "tempfile" \
  --argjson artifacts "[{ \"name\" : \"oer\", \"version\" : \"$ot\" }]" \
  --arg test "2021" \
   '$ARGS.named'

Это должно привести к:

{
  "configId": "",
  "objectname": "tempfile",
  "artifacts": [
    {
      "name": "oer",
      "version": "1.01"
    }
  ],
  "test": "2021"
}
0
09.11.2021, 06:52

Самый безопасный способ создать JSON в командной строке — использовать инструмент, который создает его для вас, как это делает jq. Однако, поскольку у вас есть вложенная структура, вы можете захотеть создать эту подструктуру -в отдельном вызове jq, как показано glenn jackman .

Еще один способ сделать то, что они показывают, но за один раз:

jq -n \
    --arg configId "$configid" \
    --arg objectname tempfile \
    --argjson artifacts "$( 
        jq -n \
            --arg name oer \
            --arg version "$ot" \
            '$ARGS.named'
    )" \
    --arg test 2021 \
    '$ARGS.named'

Мы используем --argjsonвместо --argдля включения документа JSON из внутреннего jq, так как это документ JSON, а не строка, требующая кодирования.

Вы также можете использовать jo, что может немного сократить набор текста,

jo  configId="$configid" \
    objectname=tempfile \
    artifacts="$( jo name=oer version="$ot" )" \
    test=2021

Описание утилиты joнаходится здесь:https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/

1
09.11.2021, 07:29

Теги

Похожие вопросы