curl: adicione string como opção no bash

0

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

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

Assim, se a foto e os adicionais não estiverem vazios, o $ APISTRING deverá ser:

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

Mas quando estou chamando curl

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

Isso gera um erro como

curl: option --data-urlencode "picture=someinfo" --data-urlencode "additional_info=additional infos here": is unknown

Alguém tem uma ideia de como lidar com isso?

    
por Andrew C 30.08.2017 / 15:47

2 respostas

2

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.

    
por 31.08.2017 / 19:13
0

Você tem citações 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}
    
por 31.08.2017 / 10:14