【发布时间】:2013-11-30 23:12:00
【问题描述】:
我在 bash 脚本中有一个函数,看起来像这样(简化):
# Usage: f URL [PARAMETER]...
f() {
local URL="$1"; shift
local PARAMS
for arg in "$@"; do
PARAMS="${PARAMS}&${arg}"
done
PARAMS="${PARAMS#'&'}"
local DATA_OPTION
[ -z "${PARAMS}" ] || DATA_OPTION='--data'
curl -o - "${DATA_OPTION}" "${PARAMS}" "${URL}"
}
它可以被称为f http://example.com/resource 或f http://example.com/resource p1=v1 p2=v2。问题是当DATA_OPTION 和PARAMS 为空时。在这种情况下,Bash 将两个空参数传递给 curl,然后它们被 curl 识别为 URL,并产生以下丑陋的消息:
curl: (3) <url> malformed
curl: (3) <url> malformed
我使用 if/else 暂时解决了这个问题,所以 DATA_OPTION 和 PARAMS 根本不会通过:
[..]
if [ -z "${PARAMS}" ]; then
curl -o - --data "${PARAMS}" "${URL}"
else
curl -o - "${URL}"
fi
}
但这对我来说似乎很难看。有没有更优雅的解决方案?请注意,PARAMS 周围的引号是必需的,因为某些参数值可能包含空格。
【问题讨论】: