我在一个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/else 暂时解决了这个问题,这样就完全不需要传递 DATA_OPTION
和 PARAMS
:
[..]
if [ -z "${PARAMS}" ]; then
curl -o - --data "${PARAMS}" "${URL}"
else
curl -o - "${URL}"
fi
}
但我觉得这样很丑陋。有没有更优雅的解决方案?请注意,PARAMS
周围的引号是必需的,因为一些参数值可能包含空格。
--data
,而不是简单地使用${PARAMS:+--data "$PARAMS"}
? - janos:+
)和参数(--data
)之间有一个引号,就很容易知道它们之间的分界点(空格也可以,但参见第一个原因)。 - Gordon Davisson