Traté de usar bash para ejecutar el siguiente script:
#!/bin/bash myvar="data1" data='[ { "resource_name": "data1.something", "resource_type": "Topic" }, { "resource_name": "data2.something", "resource_type": "Topic" } ]' query=$(echo ".[] | select((.resource_type==\"Topic\") and (.resource_name | startswith(\"${myvar}\") | not))") echo ${data} | jq ${query}No funciona debido a la línea:
echo ${data} | jq ${query}Pero si ejecuto el mismo script en zsh, funciona. y me da el siguiente error:
jq: error: Could not open file |: No such file or directory jq: error: Could not open file select((.resource_type=="Topic"): No such file or directory jq: error: Could not open file and: No such file or directory jq: error: Could not open file (.resource_name: No such file or directory jq: error: Could not open file |: No such file or directory jq: error: Could not open file startswith("data1"): No such file or directory jq: error: Could not open file |: No such file or directory jq: error: Could not open file not)): No such file or directoryNo pude entender cuál es exactamente el problema aquí, solo puedo pensar que de alguna manera necesito agregar comillas simples cuando lo uso con bash.
Por ejemplo, si uso comillas simples:
echo ${data} | jq \'${query}\'da un error:
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:'.[] jq: 1 error de compilación
Se prefiere usar la opción --arg para importar contenido como variables en lugar de inyectar variables de shell en el código de filtro real. Esto también le evita tener que lidiar con comillas simples o dobles.
#!/bin/bash myvar="data1" data='[ { "resource_name": "data1.something", "resource_type": "Topic" }, { "resource_name": "data2.something", "resource_type": "Topic" } ]' query='.[] | select((.resource_type==$type) and (.resource_name | startswith($var) | not))' echo "${data}" | jq --arg type "Topic" --arg var "${myvar}" "${query}" { "resource_name": "data2.something", "resource_type": "Topic" }