1

I run

/usr/local/bin/curl -V
    curl 7.63.0-DEV (x86_64-pc-linux-gnu) libcurl/7.63.0-DEV OpenSSL/1.1.1a zlib/1.2.11 brotli/1.0.3 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.1_DEV nghttp2/1.36.0-DEV

bash --version
    GNU bash, version 4.4.23(1)-release (x86_64-suse-linux-gnu)

This curl query to an api endpoint works perfectly at shell

TOKEN="testtoken" /usr/local/bin/curl \
 -H "content-type: application/json" \
 -H "Authorization: Bearer ${token}" \
-X GET ${url}/endpoint

& returns the expected result, e.g.

{
  "result" : "blah"
}

Only the last line of the command varies. I want to wrap the rest into a bash convenience script.

Trying to avoid escaping-hell, after reading

I'm trying to put a command in a variable, but the complex cases always fail! http://mywiki.wooledge.org/BashFAQ/050

and @ stackoverflow

pass an array of headers to curl into a bash script

I cobbled up this script,

cat test.sh
    #!/bin/bash
    token="testtoken" 

    mk_keyval() {
      local mkey=${1}
      local mval=${2}
      echo "\"${mkey}: ${mval}\""
    }

    mk_hdrs() {
      HDR=()
      HDR[0]=$(mk_keyval "content-type" "application/json")
      HDR[1]=$(mk_keyval "Authorization" "Bearer ${token}")
    }

    mk_hdrs
    echo -e "${HDR[@]/#/-H }\n"
    /usr/local/bin/curl "${HDR[@]/#/-H }" "@"

on exec

bash ./test.sh -X GET ${url}/endpoint

it instead returns

-H "content-type: application/json" -H "Authorization: Bearer testtoken"

curl: (6) Could not resolve host:

The echo'd headers match the at-shell usage, from above,

 -H "content-type: application/json" \
 -H "Authorization: Bearer ${token}" \

How do I get the script's escaping right so it execs the same as the shell command?

1
  • Talk about overcomplicating things. Why do you not simply use the precise command which worked at the prompt? Commented Dec 3, 2018 at 4:45

1 Answer 1

2

I suppose the issue is with the last line where you actually execute the curl command. See

/usr/local/bin/curl "${HDR[@]/#/-H }" "@"
#                                     ^^^ this is an incorrect token, should have been "$@"

The actual positional arguments list in bash is "$@" which should have been used in your command as

/usr/local/bin/curl "${HDR[@]/#/-H }" "$@"
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.