2011-06-07 51 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