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

如何使嵌套双引号在bash解释器中生存?,bash,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

鉴于以下上下文

是否存在任何可以插入$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
...
wget: --cut-dirs: Invalid number `3 -r -l10 -dnv -x -H --timesta.. ..indows NT 5.1)"'.'
很明显,为什么“\”没有在bash解释器中“幸存”

#2。结果:

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
...
wget: --cut-dirs: Invalid number `3 -r -l10 -dnv -x -H --timesta.. ..indows NT 5.1)"'.'
在这里,双引号导致传递一个参数,wget从中解析命名参数,然后(正确地)假设其余参数是它的参数,而不考虑空格

#3。工作,我正在使用它,但我确实记得因为使用邪恶/评估而受到惩罚

#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"

非常感谢。我没有想到这一点,真是痛苦。我更关注双引号的问题,而不是程序想要的arg数组。“eval”解析参数字符串的方式(考虑到引号/双引号)对我来说当然更自然,但我想,另一种方式,bash方式实际上是一种功能,我已经使用了很多年,没有真正考虑它。