Обработка кавычек в переменных внутри подстановки команд

Я хочу собрать вызов 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 непосредственно перед отправкой вопроса. Проблема заключается в разделении слов, выполняемом синтаксическим анализатором оболочки до того, как он вызовет данную команду. Правильный способ сделать это в моем случае - предоставить параметры в виде массива (старые bashes могут не поддерживать это):

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] => */*

person zb226    schedule 15.12.2020    source источник
comment
Но есть одинарные кавычки, которые обычно удаляются при удалении кавычек до того, как curl увидит заголовок. Заключая их в двойные кавычки, они сохраняются, но curl не знает, что с ними делать.   -  person choroba    schedule 16.12.2020
comment
@choroba: это имеет большой смысл. спасибо, пожалуйста, опубликуйте этот комментарий как ответ!   -  person zb226    schedule 16.12.2020
comment
Хм. Поскольку вы заметили BashFAQ # 50 и изменили вопрос, это делает его не таким дублирующим многие другие вопросы, которые у нас есть по той же проблеме. Возможно, заголовок следует отредактировать, чтобы различать?   -  person Charles Duffy    schedule 16.12.2020
comment
@CharlesDuffy Я прочитал не только один из этих вопросов, но недостающая часть информации не была передана ответами ... подумал, что это может помочь другим!   -  person zb226    schedule 16.12.2020


Ответы (1)


нет места для ошибочного разделения?

Но есть одинарные кавычки, которые обычно удаляются при удалении кавычек до того, как curl увидит заголовок. Заключая их в двойные кавычки, они сохраняются, но curl не знает, что с ними делать.

person choroba    schedule 15.12.2020