現在、JSON構造を必要とするAPIを介してデータをプッシュする際に問題が発生しました。次のように作成したファイルから値を読み取る必要があります。
file="/value"
name=$(cat "$file")
したがって、$ nameは値ファイル内のコンテンツの変数であり、うまく機能します。データをプッシュする必要があるときに問題が発生します。
cos -u https://myapi.com push data '{
"sec": 0,
"usage": 0,
"actions": [
{
"name": "transfer",
"data": {
"from": "test",
"to": "test2",
"value": $name,
"message": ""
},
「値」オブジェクトの名前を読み取る変数をどのように定義しますか?
答え1
ファイルのデータを生の文字列として扱う必要があると仮定すると、JSONでエンコードする必要があります。これは、次のようにJSONを理解するプログラムを使用して最も簡単に実行できますjq
。
json='
{
"actions": [
{
"data": { "from": "test", "message": "", "to": "test2" },
"name": "transfer"
}
],
"sec": 0,
"usage": 0
}
'
json=$( jq --arg value "$(cat "$file")" '.actions[0].data.value = $value' <<<"$json" )
cos -u 'https://myapi.com' push data "$json"
$value
式にはjq
シェル変数はありませんが、値jq
がコマンドラインに提供され、--arg
自動的にJSONにエンコードされる内部変数があります。
データを処理するより便利な方法は、$file
コマンドラインからデータを拡張せずに(データが大きい場合は重要かもしれません)、データを個別にJSON文字列に変換してそれを挿入するjq
メソッドに渡すことです。プロセス別の正しい場所:
jq '.actions[0].data.value = input' - <( jq -Rs . data ) <<<"$json"
ファイルから読み取ったキー値でオブジェクトをjo
作成し、data
シェル変数を使用してオブジェクトを挿入することもできます。value
$file
datajson=$( jo from=test message="" to="test2" value=@"$file" )
json='
{
"actions": [
{
"data": '"$datajson"',
"name": "transfer"
}
],
"sec": 0,
"usage": 0
}
'
cos -u 'https://myapi.com' push data "$json"
挿入用にJSON文書を構成する一重引用符文字列を一時的に区切る方法に注意してください$datajson
。