curl: добавить строку как опцию в bash

1056
Andrew C

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

if [ ! -z $ ]; then APISTRING+="--data-urlencode \"picture=$\" ";fi if [ ! -z $ ]; then APISTRING+="--data-urlencode \"additional_info="$"\" ";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" "$" 

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

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

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

0
См. [** Но что, если…? **] (https://unix.stackexchange.com/q/171346/23408#286350) Scott 7 лет назад 0
Смотрите http://mywiki.wooledge.org/BashFAQ/050 glenn jackman 7 лет назад 0

2 ответа на вопрос

2
Gordon Davisson

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

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

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

Обратите внимание, что массивы не доступны во всех POSIX оболочек, так что вы должны использовать только в сценариях вы явно использовать Баш для (т.е. в притон : либо #!/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" \ $"} \ $"} 

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

0
Sibilia

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

исправить:

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

Похожие вопросы