Я хочу собрать вызов curl
с двумя переменными (одну для общих аргументов и одну для URL) и зафиксировать вывод с помощью подстановки команд. Это ломается, когда я добавляю параметры, которые нужно заключать в кавычки, например, -H "Accept: text/html"
.
Вот небольшой скрипт для демонстрации проблемы, который вызывает общедоступную эхо-службу для отображения заголовков отправленных запросов:
#!/bin/bash
COMMON_ARGS="--http1.1 -H \"Accept: text/html\""
URL="http://scooterlabs.com/echo"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "1 $RETVAL"
RETVAL=$(curl -s --http1.1 -H "Accept: text/html" $URL | grep Accept)
echo "2 $RETVAL"
Выход:
1 [Accept] => */*
2 [Accept] => text/html
Таким образом, первая попытка, когда я пытаюсь предоставить заголовок через переменную, не работает (curl
отправляет значение по умолчанию Accept: */*
), тогда как вторая попытка, когда я вручную добавляю заголовок, работает. Ни использование одинарных кавычек, ни экранирование кавычек не помогли.
Обновление: я усвоил по крайней мере часть своего урока, когда наткнулся на BashFaq/050 непосредственно перед отправкой вопроса. Проблема заключается в разделении слов, выполняемом синтаксическим анализатором оболочки до того, как он вызовет данную команду. Правильный способ сделать это в моем случае - предоставить параметры в виде массива (старые bash
es могут не поддерживать это):
COMMON_ARGS=(--http1.1 -H "Accept: text/html")
RETVAL=$(curl -s "${COMMON_ARGS[@]}" $URL | grep Accept)
echo "3 $RETVAL"
Выход:
3 [Accept] => text/html
Но я все еще не мог понять одну вещь: если разбиение слов по умолчанию действует на пробел, табуляция и новая строка. тогда почему этот вариант не работает - нет места для ошибочного разделения?
COMMON_ARGS="--http1.1 -H 'Accept:text/html'"
RETVAL=$(curl -s $COMMON_ARGS $URL | grep Accept)
echo "4 $RETVAL"
Выход:
4 [Accept] => */*