Используйте jq для обновления свойства объекта, содержащего другое свойство с определенным значением

Это действительно возможно. Вы можете сделать что-то вроде этого:

nohup sh -c "printf 'foo\nbar\n' | myScript.sh"

Это будет передавать fooи barв качестве входных данных.


Но не делайте этого. Только не используйте read. На самом деле, я даже не могу придумать какой-либо веской причины для когда-либо использования readвнутри скрипта. Я уверен, что есть некоторые крайние случаи, когда это необходимо, но вы должны избегать этого, когда это возможно. Заставлять пользователей вводить данные обременительно, подвержено ошибкам и делает невозможным автоматизацию вашего сценария.

Так что просто измените свой скрипт, чтобы он читал данные из командной строки:

#!/bin/sh 
info1="$1"
info2="$2"
 echo "$info1 $info2">>log.txt 

Затем запустите скрипт с любыми параметрами, которые вы хотите:

myScript.sh foo bar

или

myScript.sh 'this one has spaces!' bar
0
03.12.2021, 10:19
1 ответ

Предполагая, что ваш документ JSON правильно сформирован, что не соответствует показанному вами примеру, поскольку он содержит несколько проблем:

$ cat file
{
  "root": {
    "instances": [
      {
        "name": "1",
        "configs": [
          {
            "keyname": "foo",
            "value": ""
          },
          {
            "keyname": "barrr",
            "value": "barrrr"
          }
        ]
      },
      {
        "name": "2",
        "configs": [
          {
            "keyname": "foo",
            "value": ""
          },
          {
            "keyname": "buzzz",
            "value": "buzzz"
          }
        ]
      }
    ]
  }
}
$ jq '(.root.instances[].configs[] | select(.keyname == "foo") ).value |= "foo"' file
{
  "root": {
    "instances": [
      {
        "name": "1",
        "configs": [
          {
            "keyname": "foo",
            "value": "foo"
          },
          {
            "keyname": "barrr",
            "value": "barrrr"
          }
        ]
      },
      {
        "name": "2",
        "configs": [
          {
            "keyname": "foo",
            "value": "foo"
          },
          {
            "keyname": "buzzz",
            "value": "buzzz"
          }
        ]
      }
    ]
  }
}

Это выражение jqобновляет значение ключа .valueдо строки foo. Обновляемый ключ выбирается из одной из записей в .root.instances[].configs[]. Обратите внимание, что .root.instances— это массив, и каждая запись .configsв каждом из его элементов также является массивом. Оператор select()проверяет ключ .keynameстрокой foo.

Создание ключа запроса и переменной нового значения выполняется следующим образом:

jq  --arg querykey 'foo' \
    --arg newval 'The train said "choo choo"' \
    '(.root.instances[].configs[] | select(.keyname == $querykey) ).value |= $newval' file

Это создает две внутренние jqпеременные с именами $querykeyи $newval. Их значения будут правильно закодированы, так что, например. $newvalможет содержать двойные кавычки, как показано выше.

1
03.12.2021, 12:54

Теги

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