115 votes

Construire une chaîne JSON avec des variables Bash

J'ai besoin de lire ces variables bash dans ma chaîne JSON et je ne suis pas familier avec bash. toute aide est appréciée.

 #!/bin/sh

BUCKET_NAME=testbucket
OBJECT_NAME=testworkflow-2.0.1.jar
TARGET_LOCATION=/opt/test/testworkflow-2.0.1.jar

JSON_STRING='{"bucketname":"$BUCKET_NAME"","objectname":"$OBJECT_NAME","targetlocation":"$TARGET_LOCATION"}'


echo $JSON_STRING 
 

231voto

chepner Points 54078

Il est préférable d’utiliser un programme tel que jq pour générer le code JSON, si vous ne savez pas à l’avance si le contenu des variables est correctement sauvegardé pour inclusion dans JSON. Sinon, vous ne vous retrouverez qu'avec un code JSON non valide.

 BUCKET_NAME=testbucket
OBJECT_NAME=testworkflow-2.0.1.jar
TARGET_LOCATION=/opt/test/testworkflow-2.0.1.jar

JSON_STRING=$( jq -n \
                  --arg bn "$BUCKET_NAME" \
                  --arg on "$OBJECT_NAME" \
                  --arg tl "$TARGET_LOCATION" \
                  '{bucketname: $bn, objectname: $on, targetlocation: $tl}' )
 

57voto

dtmilano Points 26472

Vous pouvez utiliser printf :

 JSON_FMT='{"bucketname":"%s","objectname":"%s","targetlocation":"%s"}\n'
printf "$JSON_FMT" "$BUCKET_NAME" "$OBJECT_NAME" "$TARGET_LOCATION"
 

beaucoup plus clair et simple

47voto

Cyrus Points 1567

Une possibilité:

 JSON_STRING='{"bucketname":"'"$BUCKET_NAME"'","objectname":"'"$OBJECT_NAME"'","targetlocation":"'"$TARGET_LOCATION"'"}'
 

18voto

glenn jackman Points 69748

Tout d'abord, ne pas utiliser ALL_CAPS_VARNAMES: il est trop facile d'écraser accidentellement un crucial shell variables (CHEMIN de)

Mélanger les guillemets simples et doubles dans les cordes de coquille peut être une corvée. Dans ce cas, je ne l'utiliserais printf:

bucket_name=testbucket
object_name=testworkflow-2.0.1.jar
target_location=/opt/test/testworkflow-2.0.1.jar
template='{"bucketname":"%s","objectname":"%s","targetlocation":"%s"}'

json_string=$(printf "$template" "$BUCKET_NAME" "$OBJECT_NAME" "$TARGET_LOCATION")

echo "$json_string"

Pour les devoirs, lire attentivement cette page: implications pour la Sécurité de l'oubli de citer une variable bash/POSIX coquilles


Une note sur la création de JSON avec la concaténation de chaîne: il y a des cas limites. Par exemple, si l'un de vos chaînes contiennent des guillemets, vous pouvez cassé JSON:

$ bucket_name='a "string with quotes"'
$ printf '{"bucket":"%s"}\n' "$bucket_name"
{"bucket":"a "string with quotes""}

Faire cela avec plus de sécurité dans bash, nous avons besoin d'échapper à cette chaîne entre guillemets doubles:

$ printf '{"bucket":"%s"}\n' "${bucket_name//\"/\\\"}"
{"bucket":"a \"string with quotes\""}

6voto

Si vous devez créer une représentation JSON dans laquelle les membres mappés sur des variables non définies ou vides doivent être omis, alors jo peut vous aider.

 #!/bin/bash

BUCKET_NAME=testbucket
OBJECT_NAME=""

JO_OPTS=()

if [[ ! "${BUCKET_NAME}x" = "x" ]] ; then
        JO_OPTS+=("bucketname=${BUCKET_NAME}")
fi

if [[ ! "${OBJECT_NAME}x" = "x" ]] ; then
        JO_OPTS+=("objectname=${OBJECT_NAME}")
fi

if [[ ! "${TARGET_LOCATION}x" = "x" ]] ; then
        JO_OPTS+=("targetlocation=${TARGET_LOCATION}")
fi

jo "${JO_OPTS[@]}"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X