A sua versão original não será eval
able porque o nome do autor tem espaços - seria interpretado como executando um comando Doe
com a variável de ambiente AUTHOR
definida como John
. Também não há praticamente necessidade de canalizar jq
para si mesmo - o encanamento interno & O fluxo de dados pode conectar diferentes filtros juntos.
Você pode fazer uma versão muito mais simples do programa jq:
jq -r '.SITE_DATA | to_entries | .[] | .key + "=\"" + .value + "\""'
quais saídas:
URL="example.com"
AUTHOR="John Doe"
CREATED="10/22/2017"
Não há necessidade de map
: .[]
lida com cada uma delas objeto na matriz através do restante do pipeline como um item separado , então tudo após o último |
é aplicado a cada um separadamente. No final, apenas montamos uma string de atribuição de shell válida com concatenação +
comum, incluindo aspas em torno do valor.
Todos os canais são importantes aqui - sem eles, você recebe mensagens de erro bastante inúteis, em que partes do programa são avaliadas em contextos sutilmente diferentes.
Esta string é eval
desde que os caracteres '
, $
, newline e null não apareçam nos dados:
eval "$(jq -r '.SITE_DATA | to_entries | .[] | .key + "=\"" + .value + "\""' < data.json)"
echo "$AUTHOR"
Como sempre, ao usar eval
, tome cuidado para confiar nos dados que você recebe, pois, se for malicioso ou apenas em um formato inesperado, as coisas podem dar errado.