created=$(curl -i -X POST -H 'Content-Type:application/json' --data "$(payload)" https://myurl/resource)
上記はjsonオブジェクトを返します。
{
"revision": {
"clientId": "",
"version": 1,
"lastModifier": "admin"
},
"id": "idvalue",
"uri": "https://myurl/idvalue",
"position": {
"x": 100,
"y": 200
}
}
上記のオブジェクトからIDを取得するには、次のコードを使用しています。
idvar=$(echo $created | jq ' .id' )
ただし、上記の内容は次のエラーを生成します。
parse error: Invalid numeric literal at line 1, column 9
答え1
()を使用してこれらのヘッダーを要求したため、応答にはcurl
HTTPヘッダーが含まれます。これは、変数の内容にHTTPヘッダーと一部のJSONが含まれることを意味します。-i
--include
created
ツールjq
はHTTPヘッダーを解析できないため、文句を言います。標準のHTTP応答ヘッダーは次のように始まりますHTTP/1.1 200 OK
。 「行1、列9」の位置は、正確に文字列の最初の空白文字がある場所で、JSONパーサーは放棄してエラーを報告します。
呼び出しからその-i
オプションを削除すると、curl
コードが機能します。ただし、キー値のみが必要な場合は、実際に中間変数にid
出力を保存する必要はありません。curl
curl -X POST \
--header 'Content-Type:application/json' \
--data "$json_document" \
'https://myurl/resource' | jq -r .id
しかし、それでもこれを行う必要がある場合は覚えておいてください。
echo
任意のデータ、特にバックスラッシュ文字を含むJSON(多くのecho
実装で中断)を出力するために使用することはできません。- zsh1を除くBourneに似たシェルでは、分割+globを防ぐためにパラメータ拡張を引用する必要があります。
したがって、次のようにする必要があります。
printf %s "$created" | jq -r .id
zsh
1 しかし引用して悪いことはありません。
答え2
クエリ文字列からスペースを削除すると機能します。
$ idvar=$(echo $created | jq '.id' )
$ echo $idvar
"idvalue"
$
JMESpathでjpを使用することを考えてみましょう(https://github.com/jmespath/jp)より正確に定義された言語構文を持っているからです。
$ echo $created | jp "id"
"idvalue"
$