Estou tentando passar uma variável para jq assim '.Linux.date.$var'
até agora tentei citá-los pelo nome, o que está funcionando bem. Mas eu quero usar a variável para chamá-los.
Eu tenho isso, que está funcionando bem
exectime=$(date -d now);
cp $check_exec_history $check_exec_history.tmp
jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.first = $key1 | .Linux.date_executed.first = $key2' $check_exec_history.tmp > $check_exec_history;
rm $check_exec_history.tmp;
Eu quero chegar a isso, mas não está funcionando:
name=first;
exectime=$(date -d now);
cp $check_exec_history $check_exec_history.tmp
jq --arg key1 true --arg key2 "$exectime" --arg name "$name" ".Linux.script_executed.$name = $key1 | .Linux.date_executed.$name = $key2" $check_exec_history.tmp > $check_exec_history;
rm $check_exec_history.tmp;
Cheguei até aqui: usando esta resposta https://stackoverflow.com/q/40027395/9496100 Mas não tenho certeza de onde estou errando.
name=first;
exectime=$(date -d now);
cp $check_exec_history $check_exec_history.tmp
jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.name==$name = $key1 | .Linux.date_executed.name==$name = $key2' $check_exec_history.tmp > $check_exec_history; rm $check_exec_history.tmp;
Você pode usar a indexação de colchetes em todos os objetos em jq, então
[$name]
funciona para o que você está tentando:Este uso de colchetes não está muito bem documentado no manual , o que faz parecer que você só pode usar
.[xyz]
, mas["x"]
funciona em qualquer lugar que.x
teria desde que não esteja logo no início de uma expressão (isto é,.a.x
e.a["x"]
são os mesmos , mas["x"]
é uma construção de matriz).Observe o uso de aspas simples acima - para que o Bash não tente interpretar
$name
e$key1
como variáveis do shell. Você deve manter as aspas duplas para--arg name "$name"
, porque essa é realmente uma variável de shell e deve ser citada para torná-la segura para uso.Michael Homer tem a resposta correta. Vou postar o que eu estava buscando em relação à pergunta do op.
Estou tentando modificar um gráfico de permissões obtido por meio de uma chamada curl da API REST usando
jq
para gerar um arquivo json que enviareiPUT
ao servidor com atualizações. A seguir está a saída da consulta da API curl:Como você pode ver, ele está aninhado. Estou tentando modificar isso usando variáveis bash toda vez que um novo conjunto de permissões é criado e quando os bancos de dados são criados. Por exemplo, estou tentando modificar
groups."1"."2"."native"
e "esquemas" também"groups."2"."2".native
e valores de "esquemas". É difícil, mas as chaves são as seguintesgroups.groupPermissionID.DatabaseID.*
Para modificar esse gráfico aninhado em tempo real por meio de um script de shell bash, usei a solução de Michael Homer de aplicar
[$name]
. No meu caso, tive que fazer isso duas vezes seguidas. ou seja,[$gID][$dID]
. Na configuração a seguir, as variáveis são constantes, mas no meu modelo são argumentos de comando passados para o script de shell bash.Que produziu o seguinte gráfico JSON atualizado para mim no
PUT
meu servidor:Michael está correto quando disse que isso está escassamente documentado. Não encontrei em nenhum lugar nos manuais. Espero que isso ajude alguém.