Вложение кавычек в значение переменной, как 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, чтобы проверить, является ли переменная непустой, и если она не должна использовать ее, но альтернативное значение: версия переменной в кавычках с соответствующим префиксом.