如何在 bash for Ubuntu for API 调用中正确传递变量?

How to properly pass a variable in bash for Ubuntu for API call?

我希望通过 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

如何正确下载此文件并确保删除局部变量?

试试这个:

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 语法中的特殊字符,但双引号再次使它们成为普通字符。

$where=incident_datetime 中的 $ 是另一回事。正如我所说,在双引号内,$ 被视为开始替换,因此 shell 本身会尝试扩展名为 where 的 shell 变量(这可能不存在,所以它会变成空白)。用反斜杠 ($where=incident_datetime) 转义它可以防止这种情况,将它变成一个普通字符传递给 curl(它将作为 URL 的一部分传递给服务器,并且大概会将其视为数据库查询的一部分)。

也可以混合引用模式:将 URL 的部分放在单引号中,将带有变量的部分放在双引号中,但在我看来,这在这种情况下更容易混淆。

哦,不要试图将变量通过管道传递给 curlecho $yesterday |)部分。这适用于从输入流中读取数据的东西,curl 不会(除非你告诉它,你不应该在这里 - 它不相关)。

顺便说一句,在您的示例浏览器 URL 中,日期值周围有卷曲的 unicode 引号。我认为这是无意的(由于某些文本编辑器 "helpfully" 转换了它们),并且纯 ASCII 引号是有意的。如果没有,请根据需要更换它们。