2011-06-07 53 views
4
下面给出的上下文

..如何在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。作品,我正在使用它,但我确实记得使用邪恶/ eval被惩罚!

#4。我会假设工作正常,我没有测试它,因为这不是我想要做的!

..从这个问题来看。

欢呼

回答

4

为了放大@伊格纳西奥的回答:如果我理解这里的目的,最好的回答是存储在阵列中的选项。

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

谢谢。我没有想到这件事是痛苦的。我更关注双引号问题,而不是程序想要的arg数组。 'eval'分析字符串的参数(考虑引号/双引号)的方式对我来说当然看起来更自然,但是我想,反过来说,bash的方式实际上是一个功能,我用它来很多年没有真正想到它。 – elbeardmorez 2011-06-08 07:09:33