在bash脚本中使用curl时标题值中的空格

在bash脚本中使用curl时标题值中的空格,bash,shell,curl,Bash,Shell,Curl,我得到以下错误 curl:6无法解析主机:someToken 但当我运行以$curlcmd输出的确切行时,它直接在终端上运行良好 curl -X POST http://google.com --data "{}" -H "Content-Type:application/json" -H "Authorization:Bearer someToken" 我认为这是由于持票人和代币之间的空白,我们需要逃跑吗 bash中的一般经验法则是永远不要尝试使用变量作为占位符来存储命令,然后从中运行命令。

我得到以下错误

curl:6无法解析主机:someToken

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

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

我认为这是由于持票人和代币之间的空白,我们需要逃跑吗

bash中的一般经验法则是永远不要尝试使用变量作为占位符来存储命令,然后从中运行命令。本节将详细介绍这一点

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

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[@]}"
试试看:

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

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

例如:

$ set -x; echo a; echo b; echo c
+ echo a
a
+ echo b
b
+ echo c
c
使用原始代码:

!/bin/bash 集合x 主机http://google.com' AUTH_TOKEN='someToken' 有效载荷=“{}” authHeader=授权:承载“$AUTH\u令牌” curl-X POST$HOST_URL-data$payload-H'内容类型:application/json'\ -H$authHeader 或者,如果只想查看脚本的一部分,可以将它们包装到子shell中 其中包含集合-x:

$ echo a; ( set -x; echo b ); echo c
a
+ echo b
b
c
使用您的脚本:

!/bin/bash 主机http://google.com' AUTH_TOKEN='someToken' 集合x 有效载荷=“{}” authHeader=授权:承载“$AUTH\u令牌” curl-X POST$HOST_URL-data$payload-H'内容类型:application/json'\ -H$authHeader 看到和
$ echo a; ( set -x; echo b ); echo c
a
+ echo b
b
c