Bash analizar cadena de varias palabras al valor JSON

Un script bash para crear nuevos repositorys github desde la command-line funciona a less que se den descripciones de varias palabras:

REPOSTRING={\"name\":\"$1\",\"description\":\"$2\",\"license_template\":\"mit\"} echo $REPOSTRING curl https://api.github.com/user/repos?access_token=xxx -d $REPOSTRING 

Llamar al script script testrepo testdescription funciona como se esperaba, pero el script testrepo "description with spaces" comete errores con:

 { "message": "Problems parsing JSON", "documentation_url": "https://developer.github.com/v3" } curl: (6) Could not resolve host: with curl: (3) [globbing] unmatched close brace/bracket in column 33 

Parece que los espacios están rompiendo el REPOSTRING aunque el echo en el script muestra REPOSTRING como

 {"name":"testrepo","description":"description with spaces","license_template":"mit"} 

con los espacios que aparecen entre comillas dobles.

¿Hay algo especial que deba hacer con los $2 en la tarea de REPOSTRING que me estoy perdiendo? Lo he intentado como

 REPOSTRING={\"name\":\"$1\",\"description\":\""$2"\",\"license_template\":\"mit\"} 

pero citar $2 explícitamente no causó ningún cambio.

Si desea tener la garantía de que la salida será aceptada por el analizador JSON, use una herramienta que sepa cómo generar JSON, como jq :

 repo_string=$(jq --arg name "$1" \ --arg description "$2" \ '.name=$name | .description=$description' \ <<<'{"license_template": "mit"}') 

Otros enfoques pueden tener problemas con condiciones que incluyen:

  • Caracteres literales (que deben escapingse para tratarse como datos en lugar de syntax)
  • Las barras diagonales inversas (que se tratarán como syntax en lugar de datos cuando se las vea con un analizador JSON, a less que, de nuevo, escapen).

Debes citar la asignación de la secuencia:

 REPOSTRING="{\"name\":\"$1\",\"description\":\"$2\",\"license_template\":\"mit\"}"