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