curl: adicione string como opção no bash

curl: adicione string como opção no bash

Gostaria de passar uma string variável para opções de comando em curl.

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

Portanto, se imagem e adicional não estiverem vazios, $APISTRING deverá ser:

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

Mas quando estou ligando para curl

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

Dá um erro como

curl: opção --data-urlencode "picture=someinfo" --data-urlencode "additional_info=informações adicionais aqui": é desconhecido

Alguém tem uma idéia de como lidar com isso?

Responder1

Incorporar aspas no valor de uma variável, como APISTRING+="--data-urlencode \"picture=${picture}\" "não funciona direito. Quando você tenta usar $APISTRING, o bash analisa aspas antes de expandir o valor da variável e não verifica novamente as cotações "novas" após a expansão. Como resultado, as aspas são tratadas como parte da string, e não como delimitadores ao redor da string.

A melhor solução para coisas assim é usar um array 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[@]}"

Observe que os arrays não estão disponíveis em todos os shells POSIX, então você só deve usar isso em scripts para os quais usa explicitamente o bash (ou seja, um shebang de #!/bin/bashou #!/usr/bin/env bash,não #!/bin/sh). Além disso, a sintaxe é muito exigente; não deixe nenhum dos parênteses nas atribuições, nas aspas duplas ou ao [@]expandir a matriz.

Aliás, há outra solução possível. Em vez de acumular as opções opcionais de antemão, você pode usarexpansão condicionalpara incluí-los 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 está em branco e se não deve usá-la, mas um valor alternativo: a versão entre aspas da variável com o prefixo apropriado.

Responder2

Você tem aspas desnecessárias em "${APISTRING}":

consertar:

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

informação relacionada