Eu tenho o seguinte arquivo JSON chamado pool.json
:
{
"AllocateActions": {},
"Available": true,
"Description": "Pool for nodes in cluster - {{CLUSTER_NAME}}",
"Endpoint": "",
"EnterActions": {
"AddProfiles": [
"{{RC_JOIN_PROFILE}}",
"image-deploy-profile",
"rc-controlplane-profile",
"rc-etcd-profile"
],
"Workflow": "rc-image-deploy"
},
"Errors": [],
"ExitActions": {
"RemoveProfiles": [
"{{RC_JOIN_PROFILE}}",
"image-deploy-profile"
],
"Workflow": "discover-base"
},
"Meta": {
"color": "black",
"feature-flags": "sane-exit-codes",
"icon": "object ungroup outline",
"title": "User added"
},
"ReadOnly": true,
"ReleaseActions": {},
"Validated": true
}
No meu script bash, estou usando jq
para passar os valores para estes espaços reservados JSON:
NODE_JSON=$(jq --arg RC_JOIN_PROFILE "$RC_JOIN_PROFILE" --arg CLUSTER_NAME "$CLUSTER_NAME" '.Description = "'$CLUSTER_NAME'"| .ExitActions.RemoveProfiles = [ "'$RC_JOIN_PROFILE'" ] | .EnterActions.AddProfiles = [ "'$RC_JOIN_PROFILE'" ]' pool.json)
Se estou passando RC_JOIN_PROFILE="test-profile"
and CLUSTER_NAME="test-cluster"
, esperava o JSON final da seguinte maneira:
{
"AllocateActions": {},
"Available": true,
"Description": "Pool for nodes in cluster - test-cluster",
"Endpoint": "",
"EnterActions": {
"AddProfiles": [
"test-profile",
"image-deploy-profile",
"rc-controlplane-profile",
"rc-etcd-profile"
],
"Workflow": "rc-image-deploy"
},
"Errors": [],
"ExitActions": {
"RemoveProfiles": [
"test-profile",
"image-deploy-profile"
],
"Workflow": "discover-base"
},
"Meta": {
"color": "black",
"feature-flags": "sane-exit-codes",
"icon": "object ungroup outline",
"title": "User added"
},
"ReadOnly": true,
"ReleaseActions": {},
"Validated": true
}
No entanto, estou recebendo o JSON abaixo:
{
"AllocateActions": {},
"Available": true,
"Description": "test-cluster",
"Endpoint": "",
"EnterActions": {
"AddProfiles": [
"test-profile",
],
"Workflow": "rc-image-deploy"
},
"Errors": [],
"ExitActions": {
"RemoveProfiles": [
"test-profile",
],
"Workflow": "discover-base"
},
"Meta": {
"color": "black",
"feature-flags": "sane-exit-codes",
"icon": "object ungroup outline",
"title": "User added"
},
"ReadOnly": true,
"ReleaseActions": {},
"Validated": true
}
Os valores existentes de .ExitActions.AddPofiles
e .ExitActions.RemoveProfiles
foram .Description
substituídos pelos valores passados. Quero os valores existentes com valores passados. Tentei vários cenários e nada funcionou. Alguém pode me ajudar com isso?
Existem três problemas principais com seu código:
jq
variáveis que nunca usa.Em vez disso, passe os valores para
jq
variáveis internas, usesub()
para substituir os espaços reservados do modelo pelos valores apropriados, use o|=
operador para simplificar a atualização dos dados necessários (a |= expression
é o mesmo quea = (a | expression)
).Aqui, os três bits no JSON de entrada que possuem espaços reservados de modelo são atualizados
sub()
para substituir os espaços reservados pelo valor apropriado. Os dois arrays são processados mapeando asub()
chamada para cada um de seus elementos, de modo que não precisamos depender de onde os placeholders estão localizados no array.Se você quiser afetar apenas o primeiro elemento das matrizes, use, por exemplo
ou, se você quiser apenas atribuir o valor ao primeiro elemento da matriz,
(e da mesma forma para o primeiro array, sem usar
map()
).Exemplo executado nos dados fornecidos:
Observe que nós, ao usar as
jq
variáveisclustername
eprofilename
que definimos na linha de comando com--arg
, podemos confiarjq
para lidar corretamente com aspas das strings.