我有很多这些来测试我的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
但这些选项似乎没有被传入。有任何线索吗?
答案 0 :(得分:3)
简短回答:见BashFAQ #50:'m trying to put a command in a variable, but the complex cases always fail!。
答案很长:将命令(或命令的一部分)放入变量中,然后将它们完整地取出是很复杂的。您的脚本无法工作的原因是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"
答案 1 :(得分: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'