【问题标题】:Whitespace in header value while using curl in bash script在 bash 脚本中使用 curl 时标头值中的空格
【发布时间】:2020-04-17 07:22:00
【问题描述】:

我收到以下错误

curl: (6) 无法解析主机:someToken"

#!/bin/bash
HOST_URL='http://google.com'

AUTH_TOKEN='someToken'

#echo $payload
payload='{}'
authHeader='"Authorization:Bearer '$AUTH_TOKEN'"'
curlcmd='curl -X POST '$HOST_URL' --data ''"'$payload'"''  -H "Content-Type:application/json"  -H  '$authHeader
echo $curlcmd
echo $($curlcmd)

但是当我运行 $curlcmd 中输出的确切行时,它直接在终端上运行良好

curl -X POST http://google.com --data "{}" -H "Content-Type:application/json" -H "Authorization:Bearer someToken"

我认为这是由于 "Bearer" 和 "someToken" 之间的空格,我们需要逃避吗?

【问题讨论】:

标签: bash shell curl


【解决方案1】:

bash 中的一般经验法则是永远不要尝试使用变量作为占位符来存储您的命令,然后从中运行您的命令。这在BashFAQ/50 - I'm trying to put a command in a variable, but the complex cases always fail!中有详细介绍

随着更多引号的使用,您的命令将难以维护。最简单的解决方案是使用数组。不过,对于您的情况,仔细嵌套将解决问题。

payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'

现在已经定义了变量,定义一个数组来存储你的命令参数

curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")

现在做一个适当的引用扩展

curl "${curlCMD[@]}"

【讨论】:

    【解决方案2】:

    试试看:

    curl -X POST $hostURL --data $payload -H 'Content-Type: application/json' -H 'Authorization: Bearer '${authToken}''
    

    【讨论】:

      【解决方案3】:

      如果您只想查看脚本中正在执行哪些命令,您可以 使用set -x

      例子:

      $ set -x; echo a; echo b; echo c
      + echo a
      a
      + echo b
      b
      + echo c
      c
      

      使用原代码:

      #!/bin/bash
      
      set -x
      
      HOST_URL='http://google.com'
      AUTH_TOKEN='someToken'
      
      payload='{}'
      authHeader="Authorization:Bearer '$AUTH_TOKEN'"
      curl -X POST "$HOST_URL" --data "$payload" -H 'Content-Type:application/json' \
        -H "$authHeader"
      

      或者,如果您只想查看脚本的部分内容,可以将它们包装在子外壳中 里面有set -x

      $ echo a; ( set -x; echo b ); echo c
      a
      + echo b
      b
      c
      

      使用您的脚本:

      #!/bin/bash
      HOST_URL='http://google.com'
      AUTH_TOKEN='someToken'
      
      (
      set -x
      payload='{}'
      authHeader="Authorization:Bearer '$AUTH_TOKEN'"
      curl -X POST "$HOST_URL" --data "$payload" -H 'Content-Type:application/json' \
        -H "$authHeader"
      )
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2017-03-24
        • 2013-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多