我对批处理脚本有点新意,所以如果这很明显,我会道歉,但我找不到任何类似的信息。
我试图执行以下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密钥..这不是问题)
答案 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
解决方案通常更受欢迎,因为您不必担心预先转义任何变量值。