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

1

Eu tenho file.json na estrutura de:

{
  "connections": {}
}

Desejo atualizar o objeto de conexões com as variáveis $1 e $2 . Estou tentando:

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

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

Espero que script.sh value key produza:

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

Como posso atualizar o objeto com vários argumentos

    
por Philip Kirkbride 22.11.2017 / 20:52

1 resposta

3

Você precisa usar [] indexing para usar variáveis (ou qualquer coisa não-literal) como a chave:

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

Aqui [$ssid] indexa em .connections com o valor de $ssid como chave. O erro estava em " .$ ", que é um erro de sintaxe, em vez de fazer com várias variáveis.

Variáveis não foram substituídas diretamente como strings na forma como podem estar em um shell script, mas são ligações lexicais nomeadas reais que devem ser usadas no contexto da expressão. O índice poderia ser uma expressão mais complexa: .connections[$ssid + "X"] = $pass colocaria um X no final primeiro e usaria isso como chave.

    
por 22.11.2017 / 21:01

Tags