Как правильно передать переменную в bash для Ubuntu для вызова API? - PullRequest
1 голос
/ 23 марта 2020

Я хочу передать переменную через bash вызову API для загрузки файла. Как правильно передать переменные в вызов http? Ниже мой bash файл:

#!/bin/bash

#rm existing file
rm Desktop/ems/ems_raw_update.csv

#create a yesterday variable looking back 120 days
yesterday=$(date -d "$date -120 days" +"%Y-%m-%d")

#download data using that 120 days lookback
echo $yesterday | curl https://data.cityofnewyork.us/resource/76xm-jjuj.csv?$where=incident_datetime>='$yesterday' -o Desktop/ems/ems_raw_update.csv

Загрузка не удалась, я предполагаю из-за способа, которым я передал переменную $ вчера. Например, введя следующее в ваш браузер, вы загрузите соответствующий файл:

https://data.cityofnewyork.us/resource/76xm-jjuj.csv?$where=incident_datetime>=‘2019-12-25’

Я также отмечаю, что в моем каталоге я вижу переменную $чера.

total 3.8G
-rw-rw-r-- 1 me   me    0 Mar 22 19:48 =2019-11-23
-rw-rw-r-- 1 me   me    0 Mar 22 19:46 =2019-12-30
-rwxr-xr-x 1 root     root    488 Mar 23 13:12 downloader.sh
-rw-rw-r-- 1 postgres me 3.8G Mar 22 12:17 ems_raw.csv
-rw-rw-r-- 1 me   me   64 Mar 23 12:51 ems_raw_update.csv
-rw-rw-r-- 1 me   me    0 Mar 23 13:12 =$yesterday

Как правильно загрузить этот файл и убрать локальные переменные?

1 Ответ

1 голос
/ 23 марта 2020

Попробуйте это:

curl "https://data.cityofnewyork.us/resource/76xm-jjuj.csv?\$where=incident_datetime>='$yesterday'" -o Desktop/ems/ems_raw_update.csv

Объяснение: Внутри двойных кавычек оболочка распознает $ как инициирующую подстановку переменной, поэтому $yesterday будет расширен до значения переменной. Он не будет раскрываться в одинарных кавычках, и он выглядит как , как будто он здесь в одинарных кавычках, но поскольку одиночные кавычки сами находятся внутри двойных кавычек, они не имеют никакого значения; это просто обычные символы (и они будут переданы curl как часть аргумента URL). ? и >>=) также являются специальными символами в синтаксисе оболочки, но опять же двойные кавычки делают их обычными символами.

$ в $where=incident_datetime другая история. Как я уже сказал, внутри двойных кавычек $ рассматривается как начало подстановки, поэтому сама оболочка будет пытаться развернуть переменную оболочки с именем where (которая, вероятно, не существует, поэтому она будет пустой ). Экранирование с помощью backsla sh (\$where=incident_datetime) предотвращает это, превращая его в обычный символ, который будет передан в curl (который передаст его на сервер как часть URL, и это, вероятно, будет относиться к это как часть запроса к базе данных).

Было бы также возможно смешать режимы цитирования: поместить части URL в одинарные кавычки, а часть с переменной в двойные кавычки, но IMO это больше сбивает с толку в подобных случаях.

О, и не пытайтесь передать переменную в curl (echo $yesterday |) часть. Это для вещей, которые читают данные из их входного потока, чего не делает curl (если вы не скажете это, чего не следует здесь делать - это не актуально).

Кстати, в вашем примере браузера URL, есть фигурные кавычки Unicode вокруг значения даты. Я предполагаю, что это непреднамеренно (из-за того, что какой-то текстовый редактор «услужливо» конвертирует их), и подразумеваются простые кавычки ASCII. Если нет, замените их при необходимости.

...