jq adiciona ou atualiza um valor com vários --arg

jq adiciona ou atualiza um valor com vários --arg

Tenho file.jsonna estrutura de:

{
  "connections": {}
}

Quero atualizar o objeto de conexões com variáveis $1​​e arquivos $2. Estou tentando:

jq --arg ssid "$1" --arg pass "$2" '.connections.$ssid = "$pass"' file.json > tmp.json && mv tmp.json file.json

Mas estou voltandojq: error: syntax error, unexpected '$', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .connections.$ssid = "$pass"

Espero script.sh value keyproduzir:

{
  "connections": {key:"value"}
}

Como posso atualizar o objeto com vários argumentos

Responder1

Você tem que usar[]indexaçãopara usar variáveis ​​(ou qualquer coisa não literal) como chave:

jq --arg ssid abc --arg pass 123 '.connections[$ssid] = $pass' < file.json
{
  "connections": {
    "abc": "123"
  }
}

Aqui [$ssid]indexa .connectionscom o valor de $ssidcomo chave. O erro estava em " .$", que é um erro de sintaxe, e não relacionado a múltiplas variáveis.

Variáveisnão são substituídos diretamente como strings da maneira que poderiam ser em um script de shell, mas são ligações lexicais nomeadas reais que devem ser usadas no contexto de expressão. O índice poderia ser uma expressão mais complexa: .connections[$ssid + "X"] = $passcolocaria primeiro um X no final e usaria isso como chave.

informação relacionada