私は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
これらのマルチクォートされた文字列内の変数を適切に置き換えるにはどうすればよいですか?
JSON=\''{"hostname": "localhost", "outdir": "'"$OUTDIR"'", "port": 20400, "size": 100000}'\'
これは、$OUTDIR
の拡張の単一引用符から外れます。スカラー変数の割り当てでは厳密に必要ではありませんが、その拡張を二重引用符で囲みました。
$JSON
変数をecho
に渡す場合、split + glob演算子を無効にするために引用符areが必要です。また、任意のデータに対してecho
を使用しないことをお勧めします。
printf '%s\n' "$JSON"
ステファンの答えは素晴らしく、賛成です。ここにヒントがあります。する代わりに
BIN=$(cat next_entry)
できるよ:
BIN=$(<next_entry)
したがって、余分なプロセスの生成を節約できます。続きを読む こちら 。
ここで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"}]}]'
^これは問題なく動作します