在批处理脚本中使用时,cURL操作的执行方式不同

时间:2016-10-11 15:48:58

标签: bash batch-file curl

我对批处理脚本有点新意,所以如果这很明显,我会道歉,但我找不到任何类似的信息。

我试图执行以下cURL调用:

curl -H "Content-Type:application/json" -d '{"lt":"f","sort":"n","max":"1500","offset":"1500"}' [API_KEY]@api.nal.usda.gov/ndb/list

当我在命令行(或Cygwin)中运行该行时,它完全符合我的要求。

但是,当我尝试从bat文件中调用它时,似乎我的参数在某种程度上变得混乱。

FOR /L %%A IN (0, 1500, 77500) DO (
   curl -H "Content-Type:application/json" -d '{"lt":"f","sort":"n","max":"1500","offset":"%%A"}' [API_KEY]@api.nal.usda.gov/ndb/list > %%A.txt
)

我将输出输入到正确的.txt文件中,但它似乎没有被替换为偏移中的%% A.我得到了一个错误的参数" API的例外情况。从命令行的输出看,它看起来很准确。

我愿意使用bash脚本而不是更有意义,但我使用bash时遇到了同样的问题。

(注意:我在示例中使用占位符替换了我的API密钥..这不是问题)

1 个答案:

答案 0 :(得分:1)

至少在bash中,问题在于单引号内不会发生变量扩展;你需要使用双引号并转义嵌套的双引号:

for a in 0 1500 77500; do
    curl -H "Content-Type:application/json" -d "{\"lt\":\"f\",\"sort\":\"n\",\"max\":\"1500\",\"offset\":\"$a\"}" [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt

我怀疑您需要在批处理文件中执行等效操作。

您可以连接相邻的单引号和双引号字符串,以最大限度地减少转义引号的数量:

... -d '{"lt": "f", "sort": "n", "max": "1500", "offset": "'"$a"'"}' ...

但您可能需要考虑其他两个选项之一。首先,从这里的文档中读取数据,而不是使用硬编码的字符串:

curl -H "..." -d@- [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt <<EOF
{"lt": "f", "sort": "n", "max": "1500", "offset": "$a"}
EOF

或使用类似jq的内容为您生成JSON:

curl -H "..." \
     -d "$(jq --arg a "$a" '{lt: "f", sort: "n", max: "1500", offset: $a}') \
     [API_KEY]@api.nal.usda.gov/ndb/list > "$a".txt

jq解决方案通常更受欢迎,因为您不必担心预先转义任何变量值。