1

我有一堆这些来测试我的 RESTful API

$CURL \
  -v \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -X POST \
  -d '{"user":{"email":"user@example.com","password":"secret"}}' \
  $URL/$PATH/sessions

我有点想把它缩短成类似

CURLOPTS="-v -H 'Content-Type: application/json' -H 'Accept: application/json'"
$CURL \
  $CURLOPTS \
  -X POST \
  -d '{"user":{"email":"user@example.com","password":"secret"}}' \
  $URL/$PATH/sessions

但选项似乎没有被传递。任何线索?

4

2 回答 2

3

简短的回答:参见BashFAQ #50:'我试图将命令放入变量中,但复杂的情况总是失败!.

长答案:将命令(或命令的一部分)放入变量中,然后将它们原封不动地取出是很复杂的。您的脚本不起作用的原因是 shell 解析命令行的顺序:它解析(并删除)引号和转义,然后替换变量值。到时间$CURLOPTS被替换时,报价达到预期效果为时已晚;相反,它们curl作为参数的一部分被传递给,这curl非常令人困惑。

解决方案:将选项存储在数组而不是纯字符串中:

CURLOPTS=(-v -H 'Content-Type: application/json' -H 'Accept: application/json')
$CURL \
  "${CURLOPTS[@]}" \
  -X POST \
  -d '{"user":{"email":"user@example.com","password":"secret"}}' \
  "$URL/$PATH/sessions"
于 2013-04-27T01:52:35.840 回答
1

您可以使用数组并触发分词

$ set -x

$ CURLOPTS=(-v -H 'Content-Type: application/json' -H 'Accept: application/json')

$ : curl "${CURLOPTS[@]}"
+ : curl -v -H 'Content-Type: application/json' -H 'Accept: application/json'
于 2013-04-27T01:52:42.227 回答