Já fiz uma pergunta semelhante no passado, mas estou tendo dificuldade em adaptar essa solução a esse problema.
Eu tenho a seguinte matriz json:
$ jq <<<"$json"
[
{
"id": "node1"
},
{
"id": "node2"
},
{
"id": "node3"
}
]
Quero adicionar uma chave/valor a cada nó ou modificá-lo se já existir. Eu posso fazer isso com:
$ jq '.[] | select(.id == "node2") += {status: "fail"}' <<<"$json"
{
"id": "node1"
}
{
"id": "node2",
"status": "fail"
}
{
"id": "node3"
}
Mas observe que a matriz externa desaparece, então quando tento implementar esta solução em meu script ela falha.
#!/usr/bin/env bash
[[ $DEBUG == true ]] && set -x
nodes=(node1 node2 node3)
json='[{"id": "node1"},{"id": "node2"},{"id": "node3"}]'
for node in "${nodes[@]}"; do
if [[ $node == node2 ]]; then
status=fail
else
status=pass
fi
json=$(jq --arg status "$status" --arg node "$node" '.[] | select(.id == $node) += {status: $status}' <<<"$json")
done
Erro:
$ ./script.sh
jq: error (at <stdin>:4): Cannot index string with string "id"
jq: error (at <stdin>:7): Cannot index string with string "id"
jq: error (at <stdin>:10): Cannot index string with string "id"
Existe uma maneira de modificar esses objetos JSON enquanto mantenho a estrutura geral?
Depois de escolher um dos elementos de
.[]
withselect()
, esses são os únicos dados que restam e o que será exibido no final.Em vez disso, use
map()
para aplicar uma (possível) modificação a cada um dos elementos do array de nível superior:Ou possivelmente mais limpo, com menos aparelhos,
Replicando seu loop de shell
jq
para evitar múltiplas invocações dejq
:Ou falhando em vários nós com cada nó com falha listado na linha de comando (observe a colocação pouco ortodoxa, mas necessária, de
--args
no final):