在不使用管道的情况下使 jq 从变量读取的最短方法是什么?

在不使用管道的情况下使 jq 从变量读取的最短方法是什么?

假设我有以下 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")的值...但是,我觉得这不是最直接的方法。我尝试过搜索参数,但没能找到对我有用的参数。在伪代码中我想要类似的东西:$jsonjqman jq

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

有什么jq参数可以让我这样做吗?或者它只适用于文件或管道,并且使用进程替换是这种情况下的解决方法?

答案1

或者它只适用于文件或管道,并且使用进程替换是这种情况下的解决方法?

嗯,它适用于文件或标准输入;管道是一种使用标准输入的方式,进程替换是一种使用文件的方式。您也可以使用heredocs或herestrings作为标准输入。

也就是说,你可以使用--argjson

% foo='{"a": "b"}'
% jq --argjson foo "$foo" -n '$foo.a'
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'

但就我个人而言,最直截了当这样做的方法是通过管道传输curljq

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

相关内容