无法在Bash中扩展和替换变量的内容

时间:2017-06-05 21:46:06

标签: json bash curl

我正在使用Gitbash,GNU bash,版本4.3.46(2)-release(x86_64-pc-msys)。 我正在运行一个看起来像这样的bash脚本

CODE CHUNK 1

curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "x-customheader:customstuff" \
   -d \
'{
  Gigantic json payload contents in here
}' \
'http://localhost:5000/api/123'

这很好用。基本上它将一个巨大的有效载荷发布到一个端点,一切都很好。问题是当我尝试用url替换变量中的值时,我得到一个卷曲错误,
卷曲:(1)libcurl中不支持或禁用协议“'http”

CODE CHUNK 2

stuff=\'http://localhost:5000/api/123\'
curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "x-customheader:customstuff" \
   -d \
'{
  Gigantic json payload contents in here
}' \
$stuff

如果我echo $stuff后紧跟stuff=\'http://localhost:5000/api/123\',我会得到'http://localhost:5000/api/123'。这与我在代码块1,单个刻度和所有内容中硬编码的值相同。在变量扩展后,如何评估该网址后,有些内容隐藏在幕后。我需要获得与硬编码网址相同的行为。

2 个答案:

答案 0 :(得分:3)

仔细查看此错误消息:

  

卷曲:(1)libcurl

中不支持或禁用协议“'http”

请注意http前面的单引号。 curl命令肯定知道http协议,但不知道'http协议!

您编写它的方式,单引号是stuff的值的一部分:

stuff=\'http://localhost:5000/api/123\'

删除它们,写成这样:

stuff='http://localhost:5000/api/123'

如果您的真实字符串中有变量, 并且你希望它们被扩展,然后使用双引号而不是单引号:

stuff="http://localhost:5000/api/123"

同样重要的是, 当您使用$stuff作为curl的参数时, 你必须加倍引用它。 如果你只是写curl $stuff, 然后shell可以在传递给$stuff之前解释curl中的一些字符。 为了防止这种情况, 你必须写curl "$stuff"

完整的命令:

curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "x-customheader:customstuff" \
   -d \
'{
  Gigantic json payload contents in here
}' \
"$stuff"

最后,确保在行尾的每个\之后, 在每行\之后没有任何内容, \必须在最后。

答案 1 :(得分:2)

为什么要使用' '定义内容?

尝试这样:

stuff="http://localhost:5000/api/123"
curl -i -X POST \
   -H "Content-Type:application/json" \
   -H "x-customheader:customstuff" \
   -d \
'{
  Gigantic json payload contents in here
}' \
"$stuff"

另外,不要将变量放在单引号中,因为bash无法理解它们。

stuff="http://localhost:5000/api/123"
echo "$stuff"
>> http://localhost:5000/api/123
echo '$stuff'
>> $stuff