JSON文字列のBash変数の置換

JSON文字列のBash変数の置換

前のコマンドの結果に基づくフィールドを使用してBASHからJSONを生成しようとしています。

BIN=$(cat next_entry)
OUTDIR="/tmp/cpupower/${BIN}"
echo $OUTDIR
JSON="'"'{"hostname": "localhost", "outdir": "${OUTDIR}", "port": 20400, "size": 100000}'"'"
echo $JSON

上記のスクリプトが実行されると、次のものが返されます。

/tmp/cpupower/0
, port: 20400, size: 100000}': /tmp/cpupower/0

複数引用符で囲まれた文字列で変数を正しく置き換える方法は?

答え1

JSON=\''{"hostname": "localhost", "outdir": "'"$OUTDIR"'", "port": 20400, "size": 100000}'\'

これは単一引用符の拡張を削除することです$OUTDIR。スカラー変数の割り当てには必ずしも必要ではありませんが、良い測定のためにその拡張子を二重引用符で囲みます。

$JSON変数を に渡すとecho引用符が付きます。はいただし、Split + Glob演算子を無効にする必要があります。ランダムなデータを避けるのが最善ですecho

printf '%s\n' "$JSON"

答え2

@Stéphane Chazelasの答えは、AWSコマンドを使用しようとするとほとんど機能しません。ここで、元のエスケープされた引用符(\ ')は必要なく、実際にコマンドを中断します。

IP=$(curl ipecho.net/plain ; echo)

aws ec2 authorize-security-group-ingress --group-id sg-**************** \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 15000, "ToPort": 15000, "IpRanges": [{"CidrIp": "'"$IP/32"'", "Description": "Service A"}]}]'

^ これはうまくいきます

答え3

Stéphaneの答えは素晴らしく、好評でした。これは単なるヒントです。

BIN=$(cat next_entry)

あなたはできます:

BIN=$(<next_entry)

これにより、追加のプロセスが節約されます。もっと読むここ

答え4

eating.json=に似たjsonファイルがある場合は、{"diner" : {"time" : ""}}次のようにします。

declare -a NOW
NOW=$(date) 
jq '.diner.time = "'"${NOW}"'"' eating.json > tmp.$$.json && mv tmp.$$.json eating.json

したがって、まず変数を作成し、必要な値を入力し、最後にを使用して一時jqファイルを変更し(jqモジュールの特殊な特性を信じます)、修正を再適用しますeating.json

関連情報