Jq

在不使用管道的情況下從變數中讀取 jq 的最短方法是什麼?

  • April 22, 2022

假設我有以下 bash 腳本:

json="$(curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2")"
jq '.address.road' <(echo "$json")

我基本上是使用 Nominatim API 來獲取特定位置的道路名稱……結果是:

"Rua Linaria"

我正在使用過程替換<(echo "$json")來使用$json變數的值jq…但是,我覺得這不是最直接的方法。我已經嘗試在 on 上搜尋一個參數,man jq但我沒有找到對我有用的東西。在虛擬碼中,我想要類似的東西:

jq --getvar "$json" '.address.road'

是否有任何jq參數可以讓我這樣做?還是它僅適用於文件或管道,並且在這種情況下使用程序替換是解決方法?

還是它僅適用於文件或管道,並且在這種情況下使用程序替換是解決方法?

好吧,它適用於文件或標準輸入;管道是一種使用標準輸入的方式,程序替換是一種使用文件的方式。您也可以將 heredocs 或 herestrings 用於標準輸入。

也就是說,您可以使用--argjson

% foo='{"a": "b"}'
% jq --argjson foo "$foo" '$foo.a' -n
b

所以,在你的情況下,你可以這樣做:

json="$(curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2")"
jq --argjson j "$json" -n '$j.address.road'

但對我個人而言,最直接的方法是通過管道curl傳輸到jq

curl -s "https://nominatim.openstreetmap.org/reverse.php?lat=-23.513442&lon=-46.384794&zoom=18&format=jsonv2" |
 jq '.address.road'

引用自:https://unix.stackexchange.com/questions/699940