curl 输出文件变量在 bash 脚本中不起作用

curl 输出文件变量在 bash 脚本中不起作用

尝试缩短使用curl 获取多个API 调用的bash 脚本需要执行以下操作:

curl --user $USER:$PASS https://api.example.com/foo -o 'foo.json'
curl --user $USER:$PASS https://api.example.com/bar -o 'bar.json'
curl --user $USER:$PASS https://api.example.com/baz -o 'baz.json'

并以这种形式使用它:

curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'

问题是,curl 正在获取 foo、bar 和 baz,但没有将输出分配给 foo.json、bar.json 和 baz.json。它实际上是创建 #1.json 并将输出通过管道输出到 stdout。已尝试使用单引号、双引号和无引号,结果均相同。这是在 bash 脚本内运行的,尽管直接在命令行上输入时,curl 命令的行为方式相同。这是 OS X 语法问题吗?

答案1

你的问题是{...}表达式是有效的 shell 语法。例如,运行:

echo file/{one,two}

你得到:

file/one file/two

所以当你运行时:

curl --user $USER:$PASS https://api.example.com/{foo,bar,baz} -o '#1.json'

正在{foo,bar,baz}被你解释,并curl实际接收命令行:

  curl --user youruser:secret https://api.example.com/foo https://api.example.com/bar https://api.example.com/baz -o '#1.json'

由于curl没有看到{...}表达式,因此您无法获得 的神奇处理#1。解决方案很简单,只需将 URL 用单引号引起来:

curl --user $USER:$PASS 'https://api.example.com/{foo,bar,baz}' -o '#1.json'

单引号禁止字符串的任何 shell 扩展。

相关内容