我希望通过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我假设下载失败是因为我传递变量$yesterday的方式。例如,在浏览器中输入以下内容将下载适当的文件:
https://data.cityofnewyork.us/resource/76xm-jjuj.csv?$where=incident_datetime>=‘2019-12-25’我还注意到,在我的目录中,我可以看到$yesterday变量。
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如何正确下载此文件并确保删除局部变量?
发布于 2020-03-23 20:00:41
试试这个:
curl "https://data.cityofnewyork.us/resource/76xm-jjuj.csv?\$where=incident_datetime>='$yesterday'" -o Desktop/ems/ems_raw_update.csv说明:在双引号内,shell将识别$作为启动变量替换,因此$yesterday将被扩展为变量的值。它不会在单引号中展开,这里看起来像单引号,但是由于单引号本身在一个双引号部分中,所以它们没有任何意义;它们只是普通字符(并将作为URL参数的一部分传递给curl )。?和> (在>=中)也是shell语法中的特殊字符,但是双引号使它们成为普通字符。
$ in $where=incident_datetime则是另一回事。正如我所说的,在双引号中,$被视为开始替换,因此shell本身将尝试展开一个名为where的shell变量(该变量可能不存在,因此它将为空)。使用反斜杠(\$where=incident_datetime)对其进行转义可以防止这种情况,将其转换为将传递给curl的普通字符(后者将将其作为URL的一部分传递给服务器,这可能会将其视为数据库查询的一部分)。
还可以混合引用模式:将URL的部分放在单引号中,将部分与变量放在双引号中,但IMO在这种情况下更容易混淆。
哦,不要试图将变量输送到curl ( echo $yesterday |)部分。这适用于从输入流读取数据的事物,而curl不这样做(除非您告诉它,这里您不应该这样做-这是不相关的)。
顺便说一句,在您的示例浏览器URL中,日期值周围有curly unicode引号。我认为这是无意的(由于某些文本编辑器“有帮助地”转换它们),并且简单的ASCII引号是有意的。如果没有,则根据需要更换它们。
https://stackoverflow.com/questions/60818526
复制相似问题