web-dev-qa-db-ja.com

JSON文字列でのBash変数の置換

私はBASHでJSONを作成しようとしていますが、フィールドの1つは以前のコマンドの結果に基づいています

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

これらのマルチクォートされた文字列内の変数を適切に置き換えるにはどうすればよいですか?

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

これは、$OUTDIRの拡張の単一引用符から外れます。スカラー変数の割り当てでは厳密に必要ではありませんが、その拡張を二重引用符で囲みました。

$JSON変数をechoに渡す場合、split + glob演算子を無効にするために引用符areが必要です。また、任意のデータに対してechoを使用しないことをお勧めします。

printf '%s\n' "$JSON"
14

ステファンの答えは素晴らしく、賛成です。ここにヒントがあります。する代わりに

BIN=$(cat next_entry)

できるよ:

BIN=$(<next_entry)

したがって、余分なプロセスの生成を節約できます。続きを読む こちら

3
maulinglawns

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

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

^これは問題なく動作します

0
Alan Sikora