我正在使用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,单个刻度和所有内容中硬编码的值相同。在变量扩展后,如何评估该网址后,有些内容隐藏在幕后。我需要获得与硬编码网址相同的行为。
答案 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