首页 文章

如何在bash脚本中传递并正确地将HTTP标头/参数转义为curl?在shell上运行正常: - /

提问于
浏览
1

我跑

/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)

这个对api endpoints 的卷曲查询在shell上完美运行

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

&返回预期结果,例如

{
  "result" : "blah"
}

只有命令的最后一行有所不同 . 我想将其余部分包装成bash便利脚本 .

读完后,试着避免逃避地狱

我正在尝试将命令放在变量中,但复杂的情况总是会失败! http://mywiki.wooledge.org/BashFAQ/050

和@ stackoverflow

pass an array of headers to curl into a bash 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 }" "@"

在执行

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

它反而回来了

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

curl: (6) Could not resolve host:

echo'd标头与at-shell使用相匹配,从上面开始,

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

如何使脚本的转义正确,以便它执行与shell命令相同的操作?

1 回答

  • 2

    我想问题是你实际执行 curl 命令的最后一行 . 看到

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

    bash 中的实际位置参数列表是 "$@" ,它应该在您的命令中用作

    /usr/local/bin/curl "${HDR[@]/#/-H }" "$@"
    

相关问题