鱼壳|使用curl和JSON进行命令替换以进行变量分配

问题描述

我找不到有关多次使用Command Substitution的Fish Shell文档。

我正在尝试从LocationIQ的curl API查询中传递的JSON结果集(jq解析器)中分配州,城市。 2命令替换1:(curl)和2:(jq)。如果我可以获取地址变量分配,则不需要位置变量分配

功能用途: #接受2个参数(纬度,经度)并返回2个变量$ State,$ City

JSON:

{
  "address": {
    "city": "aurora","country": "United States of America","country_code": "us","county": "Kane County","postcode": "60504","road": "Ridge Road","state": "Illinois"
  },"boundingBox": [
    "41.729347","41.730247","-88.264466","-88.261979"
  ],"display_name": "Ridge Road,aurora,Kane County,Illinois,60504,USA","importance": 0.2,"lat": "41.729476","licence": "https://locationiq.com/attribution","lon": "-88.263423","place_id": "333878957973"
}

我的功能

function getLocation            
   set key 'hidden'
   set exifLat $argv[1]
   set exifLon $argv[2]
   set location (curl -s "https://us1.locationiq.com/v1/reverse.PHPkey=$key&lat=$exifLat&lon=$exifLon&format=json" | set address (jq --raw-output  '.address.state,.address.city') )
   
   echo "Location: $location
   echo "state:    $address[1]"
   echo "city:     $address[2]"
end

错误:fish命令不允许替换

仅使用curl命令替换就可以正常工作->删除jq的set address和parens。

set location (curl -s "https://us1.locationiq.com/v1/reverse.PHPkey=$key&lat=$exifLat&lon=$exifLon&format=json" | jq --raw-output  '.address.state,.address.city')

我还是一个新手-也许有一种更好的方法可以达到我想要的结果:将JSON状态分配给变量,将City分配给变量?

我最初尝试(将位置[17]切成城市,位置[19]-州切成薄片),但结果不一致,因为字段似乎是动态的,并且影响多少影响排序的结果。

任何帮助表示赞赏!

解决方法

我发现嵌套的set令人困惑。您是否打算使用$ location来保存下载的JSON数据,并使用$ address来保存jq的结果?如果是,请将其拆分为单独的语句

set url "https://us1.locationiq.com/v1/reverse.phpkey=$key&lat=$exifLat&lon=$exifLon&format=json"
set location (curl -s $url)
set address (echo $location | jq --raw-output  '.address.state,.address.city')