如何使嵌套双引号在bash解释器中存活?

时间:2011-06-07 19:56:57

标签: bash

考虑下面的背景..

是否存在任何可以插入$ 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 即可。我假设工作正常,我没有测试它,因为那不是我想要的方式!!

..因此问题。

欢呼声

1 个答案:

答案 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"