如何在 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 的部分放在单引号中,将带有变量的部分放在双引号中,但在我看来,这在这种情况下更容易混淆。
哦,不要试图将变量通过管道传递给 curl
(echo $yesterday |
)部分。这适用于从输入流中读取数据的东西,curl
不会(除非你告诉它,你不应该在这里 - 它不相关)。
顺便说一句,在您的示例浏览器 URL 中,日期值周围有卷曲的 unicode 引号。我认为这是无意的(由于某些文本编辑器 "helpfully" 转换了它们),并且纯 ASCII 引号是有意的。如果没有,请根据需要更换它们。
我希望通过 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 的部分放在单引号中,将带有变量的部分放在双引号中,但在我看来,这在这种情况下更容易混淆。
哦,不要试图将变量通过管道传递给 curl
(echo $yesterday |
)部分。这适用于从输入流中读取数据的东西,curl
不会(除非你告诉它,你不应该在这里 - 它不相关)。
顺便说一句,在您的示例浏览器 URL 中,日期值周围有卷曲的 unicode 引号。我认为这是无意的(由于某些文本编辑器 "helpfully" 转换了它们),并且纯 ASCII 引号是有意的。如果没有,请根据需要更换它们。