Я хотел бы передать переменную строку в опции команды в curl.

if [ ! -z ${picture} ]; then APISTRING+="--data-urlencode \"picture=${picture}\" ";fi
if [ ! -z ${additional} ]; then APISTRING+="--data-urlencode \"additional_info="${additional}"\" ";fi

Так что если изображение и дополнительные не пустые, $ APISTRING должен быть:

--data-urlencode "picture=someinfo"  --data-urlencode "additional_info=additional infos here"

Но когда я звоню керл

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING}"

Выдает ошибку вроде

curl: option --data-urlencode "picture = someinfo" --data-urlencode "Additional_info = дополнительная информация здесь": неизвестно

У кого-нибудь есть идеи, как с этим справиться?

2 ответа2

2

Вставка кавычек в значение переменной, например, APISTRING+="--data-urlencode \"picture=${picture}\" " , работает неправильно. Когда вы пытаетесь использовать $APISTRING , bash анализирует кавычки перед раскрытием значения переменной и не проверяет заново "новые" кавычки после раскрытия. В результате кавычки обрабатываются как часть строки, а не как разделители вокруг строки.

Лучшее решение для таких вещей - использовать массив для хранения параметров команды:

APISTRING=()
if [ ! -z ${picture} ]; then APISTRING+=(--data-urlencode "picture=${picture}");fi
if [ ! -z ${additional} ]; then APISTRING+=(--data-urlencode "additional_info=${additional}");fi
curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" "${APISTRING[@]}"

Обратите внимание, что массивы доступны не во всех оболочках POSIX, поэтому вы должны использовать это только в сценариях, для которых вы явно используете bash (т. Е. Шебанг с символом #!/bin/bash или #!/usr/bin/env bash , а не #!/bin/sh). Кроме того, синтаксис очень требователен; не оставляйте скобки в присваиваниях, двойных кавычках или [@] при расширении массива.

Кстати, есть другое возможное решение. Вместо того, чтобы накапливать дополнительные опции заранее, вы можете использовать условное расширение, чтобы включить их на месте:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
    ${picture:+ --data-urlencode "picture=${picture}"} \
    ${additional:+ --data-urlencode "additional_info=${additional}"}

Здесь расширение :+ сообщает bash, чтобы проверить, является ли переменная непустой, и если она не должна использовать ее, но альтернативное значение: указанная версия переменной с соответствующим префиксом.

0

У вас есть лишние кавычки в "$ {APISTRING}":

исправить:

curl -v -X "POST" --url "https://example.org/api" -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" ${APISTRING}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .