考虑下面的背景..
是否存在任何可以插入$ WGETOPT定义的魔术语法,以允许$ USERAGENT变量被“吸收”,并且仍允许调用wget命令,如语法1 ?我目前使用'eval',我不满意,但也许这是我能做我想做的唯一方式吗?!
#params
USERAGENT="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
PROXYSWITCH=off
WGET=wget
WGETOPT="--cut-dirs=3 -r -l10 -dnv -x -H --timestamping --limit-rate=100K --proxy=$PROXYSWITCH -U \"$USERAGENT\""
WGETOPTminusUSERAGENT="-cut-dirs=3 -r -l10 -dnv -x -H --timestamping --limit-rate=100K --proxy=$PROXYSWITCH"
URL=http://blah
#commands
#1.
$WGET $WGETOPT $URL
#2.
$WGET "$WGETOPT" $URL
#3.
eval "$WGET $WGETOPT $URL"
#4.
$WGET $WGETOPTminusUSERAGENT -U "$USERAGENT" $URL
#1 即可。结果:
DEBUG output created by Wget 1.11.4 on Windows-MinGW.
Enqueuing http://(compatible;/ at depth 0
Queue count 1, maxcount 1.
Host `(compatible;' has not issued a general basic challenge.
...
Setting --user-agent (useragent) to "Mozilla/4.0
...
很明显为什么,“\”并没有“拯救”bash解释器。
#2 即可。结果:
wget: --cut-dirs: Invalid number `3 -r -l10 -dnv -x -H --timesta.. ..indows NT 5.1)"'.'
这里,双引号导致传递一个参数,wget从中解析一个命名参数,然后假设(正确地)其余参数是它的参数,无论空格如何。
#3 即可。工作,我正在使用它,但我记得被惩罚使用邪恶/评估!
#4 即可。我假设工作正常,我没有测试它,因为那不是我想要的方式!!
..因此问题。
欢呼声
答案 0 :(得分:4)
放大@ Ignacio的答案:如果我理解这里的目标,最好的答案是将选项存储在数组中。
#params
USERAGENT="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
PROXYSWITCH=off
WGET=wget
WGETOPT=(--cut-dirs=3 -r -l10 -dnv -x -H --timestamping --limit-rate=100K --proxy=$PROXYSWITCH -U "$USERAGENT")
$WGET "${WGETOPT[@]}" "$URL"