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