2

I am trying to write a bash script to update certain nodes in my repository. I wrote below script, but it does not seem to be working when I use variables inside curl. Below is the code. I tried all possible combinations using "" inside curl statement to resolve the variable. But it does not seem to update the nodes. (I don't get any error when running the script).

I echo'ed the curl line like:

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

and placed its output in the script, then the script runs fine and updated the node.

Can anyone provide me some guidance on why cant i update the nodes using the variables in curl.

Code Sample Below

#!/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 
3
  • 1
    With the script as written, the content of "$final_add" is passed to curl as one argument, containing -Ftags2@TypeHint="String[]" -Ftags2=/content/cq:tags/sales-stage/pre-sale -Ftags2=/content/cq:tags/sales-stage/special-offer. Is this what you want?CommentedNov 4, 2018 at 14:22
  • I need a command like this: (curl --user admin:admin -Ftags3@TypeHint="String[]" -Ftags3=/content/cq:tags/sales-stage/pre-sale -Ftags3=/content/cq:tags/sales-stage/special-offer localhost:4502/content/something/events/whats-on/…) does my $final_add ned to be changed for this?CommentedNov 4, 2018 at 14:36
  • You can use curl -v option to know the network request details.
    – 林果皞
    CommentedNov 4, 2018 at 15:26

1 Answer 1

1

Your issue is mainly with the -F flags in the string $final_paths. It is being passed a a single argument to curl. The solution is not to un-quote the variable expansion to rely on the shell splitting the string properly.

When you have a list of things that you need to pass to a program as separate items, use an array:

#!/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" 

Here, we put the options to pass to curl in the array curl_opts. We initiate this array with the things we know will always be there and then add the tag path options by iterating over the array tag_paths. The double-quoted expansion "${curl_opts[@]}" at the end will expand to all elements of the curl_opts array, with each element individually quoted.

I've also chosen to build the complete URL at the start as it is static, and I'm using the long option for curl as this is a script and we can afford to be a bit more verbose (for the sake of readability).

Doing it this way, the quoting becomes intuitive and you don't need to bother with parsing comma-separated lists, with escaping special characters, or setting IFS to some non-default value.


The same script, but for /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" 

Here, we are restricted to using only one array, $@. Elements are set in this array with set.

0

    You must log in to answer this question.

    Start asking to get answers

    Find the answer to your question by asking.

    Ask question

    Explore related questions

    See similar questions with these tags.