1

I have a bunch of these to test my 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

I kinda want to shorten it to something like

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

but the options don't seem to be passed in. Any clues?

4

2 に答える 2

3

簡単な答え: BashFAQ #50 を参照してください: コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します! .

長い答え: コマンド (またはコマンドの一部) を変数に入れ、それを元に戻すのは複雑です。スクリプトが機能しない理由は、シェルがコマンド ラインを解析する順序によるものです。シェルは、引用符とエスケープを解析 (および削除) してから、変数値を置き換えます。置き換えられるまで$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 に答える