A inserção de cotações no valor de uma variável, como APISTRING+="--data-urlencode \"picture=${picture}\" "
, não funciona corretamente. Quando você tenta usar $APISTRING
, o bash analisa as cotações antes de expandir o valor da variável e não procura novamente "novas" cotações após a expansão. Como resultado, as aspas são tratadas como parte da string, em vez de delimitadores ao redor da string.
A melhor solução para coisas como essa é usar uma matriz para armazenar as opções de comando:
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[@]}"
Note que os arrays não estão disponíveis em todos os shells do POSIX, então você deve usar isso apenas em scripts para os quais você explicitamente usa o bash (isto é, um shebang de #!/bin/bash
ou #!/usr/bin/env bash
, não % código%). Além disso, a sintaxe é muito exigente; não deixe nenhum dos parênteses nas atribuições, as aspas duplas ou o #!/bin/sh
ao expandir a matriz.
BTW, existe outra solução possível. Em vez de acumular as opções opcionais antecipadamente, você pode usar expansão condicional para incluí-las no local:
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}"}
Aqui, a expansão [@]
diz ao bash para verificar se a variável não é vazia e se é para não usá-la, mas um valor alternativo: a versão citada da variável com o prefixo apropriado.