前のコマンドの結果に基づくフィールドを使用して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
。