usando variáveis dentro do comando curl não funcionando no script bash

1

Eu estou tentando escrever um script bash para atualizar certos nós no meu repositório. Eu escrevi abaixo do script, mas não parece estar funcionando quando eu uso variáveis dentro de curl . Abaixo está o código. Eu tentei todas as combinações possíveis usando "" dentro da instrução curl para resolver a variável. Mas não parece atualizar os nós. (Eu não recebo nenhum erro ao executar o script).

Eu ecoei a linha curl como:

echo "curl --user admin:admin "$final_add" http://localhost:4502"$a""

e colocou sua saída no script, o script é executado corretamente e atualizou o nó.

Alguém pode me fornecer alguma orientação sobre por que não posso atualizar os nós usando as variáveis em curvas.

Exemplo de código abaixo

#!/bin/bash

echo "-------------------------------------------------------------------------------------------------------------------"
echo "Script to set tags"
echo "-------------------------------------------------------------------------------------------------------------------"



if [ true ]
then
    echo "**firing curl command for tags2**"

    a="/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content"
    i="[/content/cq:tags/sales-stage/pre-sale,/content/cq:tags/sales-stage/special-offer]"
    str=$i
    IFS=,
    ary=($str)

    for key in "${!ary[@]}"; do tags_paths+="-Ftags2=${ary[$key]} "; done 

    final_paths=$(echo $tags_paths | sed "s|[2],]||g")

    final_add="-Ftags2@TypeHint=\"String[]\" ${final_paths//[[[\[\]]/}"

    #have tried this without quotes too --eg : (curl --user admin:admin  $final_add http://localhost:4502$a) it too didnt work
    curl --user admin:admin  "$final_add" http://localhost:4502"$a"
fi
    
por Komatsu Kai 04.11.2018 / 14:08

1 resposta

1

Seu problema é principalmente com os sinalizadores -F na string $final_paths . Está sendo passado um único argumento para curl . A solução é não para citar a expansão da variável para confiar no shell que divide a string corretamente.

Quando você tem uma lista de coisas que você precisa passar para um programa como itens separados , use uma matriz:

#!/bin/bash

url='http://localhost:4502'
url+='/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content'

tag_paths=(
    '/content/cq:tags/sales-stage/pre-sale'
    '/content/cq:tags/sales-stage/special-offer'
)

curl_opts=( --user "admin:admin" --form "tags3@TypeHint=String[]" )

for tag_path in "${tag_paths[@]}"; do
    curl_opts+=( --form "tags2=$tag_path" )
done

curl "${curl_opts[@]}" "$url"

Aqui, colocamos as opções para passar para curl na matriz curl_opts . Iniciamos essa matriz com as coisas que sabemos que sempre estarão lá e, em seguida, adicionamos as opções de caminho da tag, iterando sobre a matriz tag_paths . A expansão com aspas duplas "${curl_opts[@]}" no final será expandida para todos os elementos da matriz curl_opts , com cada elemento citado individualmente.

Eu também escolhi construir o URL completo no começo, pois é estático, e estou usando a longa opção para curl , pois este é um script e podemos nos dar ao luxo de ser um pouco mais detalhado por uma questão de legibilidade).

Fazendo desta maneira, a cotação torna-se intuitiva e você não precisa se preocupar com a análise de listas separadas por vírgulas, com caracteres especiais de escape ou com a configuração de IFS para algum valor não padrão.

O mesmo script, mas para /bin/sh :

#!/bin/sh

url='http://localhost:4502'
url="$url/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content"

set -- \
    '/content/cq:tags/sales-stage/pre-sale' \
    '/content/cq:tags/sales-stage/special-offer'

for tag_path do
    set -- "$@" --form "tags2=$tag_path"
    shift
done

set -- --user "admin:admin" --form "tags3@TypeHint=String[]" "$@"

curl "$@" "$url"

Aqui, estamos restritos a usar apenas uma matriz, $@ . Os elementos são configurados nessa matriz com set .

    
por 04.11.2018 / 16:57