Создать переменную на основе ответа cURL - Bash - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать 2 переменные с помощью bash $lat, $long, основываясь на результате моего ответа curl.

curl ipinfo.io/33.62.137.111 | grep "lo c" | awk '{print $ 2}'

Я получил.

"42,6334, -71,3162",

Я пытаюсь получить

  • $ lat = 42.6334

  • $ long = -71.3162

Может кто-нибудь дать мне немного пу sh?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2020
IFS=, read -r lat long < <(
  curl -s ipinfo.io/33.62.137.111 |
    jq -r '.loc'
)

printf 'Latitude is: %s\nLongitude is: %s\n' "$lat" "$long"

API-интерфейс ipinfo.io возвращает данные JSON, поэтому давайте проанализируем их с помощью jq:

Вот JSON, возвращенное запросом из вашего примера:

{
  "ip": "33.62.137.111",
  "city": "Columbus",
  "region": "Ohio",
  "country": "US",
  "loc": "39.9690,-83.0114",
  "postal": "43218",
  "timezone": "America/New_York",
  "readme": "https://ipinfo.io/missingauth"
}

Мы собираемся JSON запросить запись loc из основного root объекта ..

  • curl -s ipinfo.io/33.62.137.111: загрузить данные JSON -s в режиме без вывода сообщений.
  • jq -r '.loc': обработка JSON данных, запрос записи loc основного объекта и -r выходной необработанной строки.
  • IFS=, read -r lat long < <( : Устанавливает для I nternal F ield S значение , и считывает переменные lat и long из потока вывода следующей группы команд.
1 голос
/ 03 апреля 2020

Хотя ответ @LeaGris довольно интересный, если вы не хотите использовать внешнюю библиотеку или что-то еще, вы можете попробовать это:

Детская площадка: https://repl.it/repls/ThoughtfulImpressiveComputer

coordinates=($(curl ipinfo.io/33.62.137.111 | sed 's/ //g' | grep -P '(?<=\"loc\":").*?(?=\")' -o | tr ',' ' '))

echo "${coordinates[@]}"

echo ${coordinates[0]}
echo ${coordinates[1]}

Пример вывода:

39.9690 -83.0114 # echo "${coordinates[@]}"
39.9690 # ${coordinates[0]}
-83.0114 # ${coordinates[1]}

Объяснение:

  1. curl ... получить данные JSON

  2. sed 's/ //g' удалить все пробелы

  3. grep -P ... -o

    • -P интерпретировать данный шаблон как perl регулярное выражение
    • (?<=\"loc\":").*?(?=\")
      • (?<=\"loc\":") regex lookbehind
      • .*? захватывать долготу и широту с помощью не жадного поиска
      • (?=\") regex lookahead
    • -o получить только соответствующую часть, например: 39.9690, -83.0114
  4. tr ',' ' ' замените , пробелом

  5. Наконец, мы получили что-то вроде этого: 39.9690 -83.0114

Помещение в скобки позволяет нам создать массив с двумя значениями в нем (ср. ${coordinates[...]}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...