2013-04-27 3 views
1

У меня есть куча из них, чтобы проверить мой RESTful APIБаш опции команды Encapsulate в переменных

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

Я вроде хочу, чтобы сократить его на что-то вроде

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

но варианты не кажутся чтобы быть переданным. Любые подсказки?

ответ

3

Краткий ответ: см. BashFAQ #50:'m trying to put a command in a variable, but the complex cases always fail!.

Длинный ответ: Ввод команд (или частей команд) в переменные и последующее их возвращение обратно в исходное состояние сложны. Причина, по которой ваш скрипт не работает, обусловлен порядком, в котором оболочка анализирует командную строку: он анализирует (и удаляет) кавычки и экраны, а затем заменяет значения переменных. К моменту замены $CURLOPTS, слишком поздно, чтобы кавычки имели предполагаемый эффект; вместо этого они передаются в curl как часть аргументов, что сильно смущает curl.

Решение: сохранить параметры в массив, а не простой строки:

CURLOPTS=(-v -H 'Content-Type: application/json' -H 'Accept: application/json') 
$CURL \ 
    "${CURLOPTS[@]}" \ 
    -X POST \ 
    -d '{"user":{"email":"[email protected]","password":"secret"}}' \ 
    "$URL/$PATH/sessions" 
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' 
Смежные вопросы