/ / Construir uma string JSON com variáveis ​​Bash - json, bash, citando

Construa uma string JSON com variáveis ​​Bash - json, bash, quoting

Preciso ler essas variáveis ​​bash em minha string JSON e não estou familiarizado com o bash. qualquer ajuda é apreciada.

#!/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

Respostas:

6 para resposta № 1

É melhor usar um programa como jq para gerar o JSON, se você não souber com antecedência se o conteúdo das variáveis ​​tem escape adequado para inclusão no JSON. Caso contrário, você acabará apenas com um JSON inválido para o seu problema.

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}" )

2 para resposta № 2

Primeiro, não use ALL_CAPS_VARNAMES: é muito fácil substituir acidentalmente uma variável shell crucial (como PATH)

Misturar aspas simples e duplas em strings de shell pode ser um incômodo. Neste caso, eu usaria 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"

Para lição de casa, leia esta página com atenção: Implicações de segurança de esquecer de citar uma variável em shells bash / POSIX


Uma observação sobre a criação de JSON com concatenação de string: existem casos extremos. Por exemplo, se alguma de suas strings contiver aspas duplas, você pode quebrar o JSON:

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

Faça isso com mais segurança com bash, precisamos escapar das aspas duplas dessa string:

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

2 para resposta № 3

Você pode usar printf:

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

muito claro e simples


1 para resposta № 4

Uma possibilidade:

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