2013-03-28 2 views
0

В тестовом скрипте столько раз я использую команду «curl». Чтобы оптимизировать код, я хочу, чтобы опции «curl» выполнялись в глобальной переменной.Как указать параметры команды в одной переменной?

Я прочитал условия использования «curl», и он говорит, что для передачи параметра, который содержит пробелы, должен быть заключен его в одинарные кавычки.

Но он не работает.

$ curl_options="-i -L -k -S --connect-timeout 30 --user-agent 'Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14'" 
$ curl $curl_options "http://google.com" 

Выход Результат:

curl: (6) Couldn't resolve host'' Opera ' 
curl: (6) Couldn't resolve host '(Windows' 
curl: (6) Couldn't resolve host 'NT' 
curl: (6) Couldn't resolve host '6 .1; ' 
curl: (6) Couldn't resolve host 'WOW64)' 
curl: (6) Couldn't resolve host 'Presto' 
curl: (6) Couldn't resolve host 'Version' 

ответ

3

В bash, вы должны использовать массив. Таким образом, вам не нужно беспокоиться пробел в строке, является ли частью опции, или отделяя два варианта:

curl_options=(...) 
curl_options+=("--user-agent" "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14") 

curl "${curl_options[@]}" "http://google.com" 

Если вы не можете использовать массивы (например, они Арен» т доступны в оболочке, которую вы используете), вы должны упасть назад к использованию eval:

$ curl_options="-i -L -k -S --connect-timeout 30 --user-agent 'Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14'" 
$ eval "curl $curl_options http://google.com" 

Это не идеальное решение, так как вы должны быть очень осторожны, о том, как установить значение curl_options, потому что eval не знает о что значение представляет. Оболочка просто интерполирует значение в строку, переданную в eval, и выполняет eval. Опечатки могут иметь непреднамеренные последствия.

+0

Я давно понял этот код. Но команда не одобрила этот код. – user2219963

+0

Я обновил с помощью POSIX-совместимого решения, используя 'eval'. Надеюсь, кто-то может придумать более безопасный, но я думаю, что этот случай использования был одним из оснований для добавления поддержки массива. – chepner

+0

У меня есть другая переменная \t html_content = 'свернуться $ curl_options "http://google.com"' \t html_content = 'Eval "свернуться $ curl_options http://google.com"' этот вариант будет бред какой то. – user2219963

Смежные вопросы