Cómo pasar la variable bash a JSON

Intento escribir un script de muestra en el que estoy generando nombres como 'student-101 … student-160'. Necesito publicar datos JSON y cuando lo hago, obtengo un error de análisis JSON.

Aquí está mi script:

name="student-10" for i in {1..1} do r_name=$name$i echo $r_name curl -i -H 'Authorization: token <token>' -d '{"name": $r_name, "private": true}' "<URL>" >> create_repos_1.txt echo created $r_name done 

Siempre "Problems parsing JSON" error "Problems parsing JSON" . Probé varias combinaciones de citas, etc. ¡pero nada parece funcionar!

¿Qué estoy haciendo mal?

No; use jq (o algo similar) para comstackr JSON correctamente citado utilizando inputs variables.

 name="student-10" for i in {1..1} do r_name=$name$i jq -n --arg r_name "$r_name" '{name: $r_name, private: true}' | curl -i -H 'Authorization: token <token>' -d @- "<URL>" >> create_repos_1.txt echo created $r_name done 

El argumento @- le dice a curl que lea los datos de la input estándar (a través de la tubería desde jq ) para usar para -d .


Algo como "{\"name\": \"$r_name\", \"private\": true}" puede funcionar, pero es feo y también fallará si r_name contiene algún carácter que necesita ser citado en el resultado JSON, como comillas dobles o caracteres de control ASCII.

Otra opción es usar printf para crear la cadena de datos:

 printf -v data '{"name": "%s", "private": true}' "$r_name" curl -i -H 'Authorization: token <token>' -d "$data" "$url" >> create_repos_1.txt 

Primero, su propiedad de name es una cadena, por lo que debe agregarle comillas dobles en su JSON.

Segundo, usando comillas simples, bash no hará expansión variable: no replaceá $r_name con el contenido de la variable (ver Expansión de la variable dentro de comillas simples en un command en el script bash shell para más información).

En resumen, use:

 -d '{"name": "'"$r_name"'", "private": true}'