web-dev-qa-db-ja.com

Bash変数を使用してJSON文字列を作成する

これらのbash変数をJSON文字列に読み込む必要がありますが、bashに慣れていません。どんな助けも大歓迎です。

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

JSONに含めるために変数の内容が適切にエスケープされているかどうかを事前に知らない場合は、jqなどのプログラムを使用してJSONを生成することをお勧めします。そうしないと、トラブルのために無効なJSONになってしまいます。

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}' )
51
chepner

printfを使用できます:

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

より明確でシンプルな

15

可能性:

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

まず、ALL_CAPS_VARNAMESを使用しないでください。重要なシェル変数(PATHなど)を誤って上書きするのは簡単すぎます

シェル文字列で一重引用符と二重引用符を混在させるのは面倒です。この場合、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"

宿題については、このページを注意深く読んでください。 bash/POSIXシェルで変数を引用するのを忘れることのセキュリティへの影響


文字列の連結を使用したJSONの作成に関する注意:Edgeの場合があります。たとえば、文字列のいずれかに二重引用符が含まれている場合、JSONが破損する可能性があります。

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

これをbashでより安全に行うには、その文字列の二重引用符をエスケープする必要があります。

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