Как я могу свернуться для запроса с заголовками в сценариях оболочки

Я попытался выполнить инструкцию CURL следующим образом, для которого я получаю требуемый ответ:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "q_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

Но когда я попытался передать значения переменных параметру "query", оператор curl, упомянутый ниже, не работает и обнаружил некоторое сообщение об ошибке в ответ:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "$query_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

ОШИБКА Заявление:

Не найден [CFN #0005]

Оно работает!

Это веб-страница по умолчанию для этого сервера.

Программное обеспечение веб-сервера работает, но контент еще не добавлен.

Но я уверен, что запрос curl, который я построил вторым с переменной, похож на тот же запрос curl, который я выполнил сначала. Это проверено с использованием echo, который заменяет $query_string на правильное значение.

Я также попробовал другой подход, в котором я не использовал никаких переменных для одного параметра, вместо этого я попытался, как показано ниже:

a='{"query": "query_value", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'
curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d $a

Я также пытался подставить значение использования ${a}, "$a", '$a'

все же такая же ошибка наблюдается.

1 ответ

Одинарные кавычки ' (вы используете в -d аргумент) сохранить буквальное значение каждого символа, в том числе $ (см. этот так ответ), и именно поэтому ваша переменная query_string не расширяется.

Попробуй это:

~$ query_string="my query"

~$ echo '$query_string'
$query_string

~$ echo "$query_string"
my query

Итак, вам нужно использовать двойные кавычки " если вы хотите, чтобы ваши переменные расширились до его значений.

Однако для того, чтобы вкладывать двойные кавычки (внутри других двойных кавычек), как в ваших данных JSON, вы должны либо:

  1. избегайте внутренних кавычек, вот так:

    ~$ echo "{\"query\": \"$query_string\"}"
    {"query": "my query"}
    

    но это становится очень уродливым, очень скоро; или же

  2. объединить строки в чередующиеся одинарные и двойные кавычки, например:

    ~$ echo '{"query": "'"$query_string"'"}"'
    {"query": "my query"}"
    

    который может быть более читабельным для более коротких строк; или же

  3. используйте здесь документ:

    ~$ read query <<-END
    {"query": "$query_string"}
    END
    
    ~$ echo "$query"
    {"query": "my query"}
    

    Здесь документы особенно удобны для более длинных документов, в которых вы хотите расширение параметра / переменной, подстановка команд, арифметическое расширение и т. Д.

Таким образом, после определения вашего запроса JSON одним из вышеперечисленных способов (возможно, через документ здесь), вы можете написать свой curl команда как это:

curl -s -X POST -H 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d "$query"
Другие вопросы по тегам