Tengo un fragmento JSON.
Lo siguiente no funciona:
VALUE=<<PERSON
{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}
PERSON
echo -n "$VALUE" | python -m json.tool
El resultado es:
Ningún objeto JSON podría decodificarse
Haciendo lo mismo con jq
, es decir
echo -n "$VALUE" | jq '.'
No hay salida.
Hay el mismo comportamiento para lo siguiente:
VALUE=<<PERSON
'{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Respuesta:
Ningún objeto JSON podría decodificarse
Pero lo siguiente funciona:
VALUE='{
"type": "account",
"customer_id": "1234",
"customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
echo $VALUE
sin... | jq
sería informativo.Respuestas:
Ninguna salida.
Un documento aquí es una redirección , no se puede redirigir a una variable.
Cuando se analiza la línea de comando, las redirecciones se manejan en un paso separado de las asignaciones variables. Por lo tanto, su comando es equivalente a (tenga en cuenta el espacio)
Es decir, asigna una cadena vacía a su variable, luego redirige la entrada estándar de la cadena aquí al comando (pero no hay comando, por lo que no sucede nada).
Tenga en cuenta que
es válido, como es
Es solo que no hay un comando cuya secuencia de entrada estándar se pueda configurar para contener los datos, por lo que simplemente se pierde.
Sin embargo, esto funcionaría:
Aquí, el comando que recibe el documento here es
cat
, y lo copia a su salida estándar. Esto es lo que se asigna a la variable mediante la sustitución del comando.En su caso, podría usar
sin dar el paso adicional de almacenar los datos en una variable.
fuente
PERSON="
seguido de una nueva línea y los datos de varias líneas, luego otro"
al final.PERSON='
. Eso a menos que el OP quiera interpolar variables más tarde.Debido a que la variable no está siendo establecida por su heredoc:
Si desea utilizar un heredoc para asignar un valor a una variable, necesita algo como:
fuente
<< \PERSON
proteger contra$
s en la entrada y barras diagonales en los extremos de las líneas.$(cat <<EOF ... EOF)
es una construcción extraña: ¿ejecutar un subshell y luego enviar un heredoc a cat solo para que lo envíe a STDOUT y luego asignar el resultado de ese subshell a una variable? Desearía que las personas piensen en lo que dicen sobre sus procesos de pensamiento. Asignar un heredoc a una variable víaread
, en comparación, es sensato.$(cat << EOF
... (datos) ...EOF
)
es raro. Es incómodo y complicado, pero también lo esread -d … << EOF
, especialmenteread -d '' << EOF
. Agradezco la respuesta de terdon porque solo usa programas incorporados, no programas. Pero, lo que es más importante, el$(cat << EOF
... (datos) ...EOF
)
falla si alguna línea termina con\
(barra invertida) - vea los comentarios bajo la respuesta de Kusalananda .Esto se debe a que la forma en que ha definido un documento aquí para usar con un JSON es incorrecta. Necesitas usarlo como
y hacer
printf "$VALUE"
debería volcar el JSON como se esperaba.fuente
Los heredocs y las variables no se mezclan bien o al menos no de esta manera. Tu también puedes…
Pase el heredoc como entrada estándar de una aplicación
o…
Almacenar texto de varias líneas en una variable de shell
Usé comillas simples para evitar la necesidad de escapar de las comillas dobles internas. Por supuesto, también puede usar comillas dobles, por ejemplo, si necesita expandir los parámetros:
Entonces puede usar el valor de la variable más adelante.
fuente