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/bash
ou #!/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}