bash在变量中封装了命令选项

时间:2013-04-27 01:22:39

标签: bash curl

我有很多这些来测试我的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

但这些选项似乎没有被传入。有任何线索吗?

2 个答案:

答案 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'