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.