【发布时间】:2011-03-12 09:13:59
【问题描述】:
我正在编写一个脚本来为给定的用户输入执行 CURL 命令。该脚本有多个帮助函数来创建最终将传递给 CURL 的参数列表。
一个剥离出来的例子,如下:
#!/bin/bash
function create_arg_list
{
# THIS HTTP HEADER VALUE COMES FROM THE USER and MAY CONTAIN SPACES
local __hdr="x-madhurt-test:madh urt"
local __params="http://google.co.in -X GET -H '$__hdr'"
local __resultvar="$1"
eval $__resultvar="\"$__params\""
echo "params after eval : $__resultvar"
}
create_arg_list arg_list
echo "params after eval in main code : $arg_list"
echo "Running command : curl -v $arg_list"
curl -v $arg_list
当输入参数(文件路径、url 等)中包含(引用的)空格时,该脚本运行良好。但是,当应该作为 HTTP 标头传递给 CURL 的参数包含空格时,脚本会惨遭失败。
这是我尝试过的:
- 在标头值周围使用单引号(例如“$__hdr”)。但是,这样传递给 CURL 的值是:
curl -v http://google.co.in -X GET -H 'x-madhurt-test:madh urt'
,CURL 将其视为发送的实际标头是这样的:'x-madhurt-test:madh
- 双重转义标头值(例如 \\"$__hdr\\"),但这似乎也有效。在这种情况下,CURL 将“urt”作为单独的参数并将其视为 URL
curl: (6) Couldn't resolve host 'urt"'
- 转义标头值中的空格(即使用“madh\ urt”而不是“madh urt”),但这与选项 2 相同。
有人对这里发生的问题有见解吗?
【问题讨论】:
-
仅供参考:我使用 eval 来返回变量来自这篇文章:linuxjournal.com/content/return-values-bash-functions
标签: bash scripting curl eval whitespace