2012-04-26 70 views
2

我在這個小例子的腳本中隔離了一個問題。這就是我得到:bash:用引號對待引號

$ cmd="test \"foo bar baz\"" 
$ for i in $cmd; do echo $i; done 
test 
"foo 
bar 
baz" 

而這正是我所料:

$ cmd="test \"foo bar baz\"" 
$ for i in $cmd; do echo $i; done 
test 
"foo bar baz" 

我怎樣才能改變我的代碼,以獲得預期的結果?


UPDATE也許我的第一個例子不夠好。我看了一下Rob Davis的回答,但我無法將解決方案應用到我的腳本中。我試圖簡化腳本來更好地描述我的問題。這是腳本:

#!/bin/bash 
function foo { 
    echo $1 
    echo $2 
} 

bar="b c" 

baz="a \"$bar\"" 
foo $baz 

這一點,預期產量相比腳本的輸出:

expected script 
a   a 
"b c"  "b 

回答

2

首先,你要求foo bar baz左右的雙引號同時做兩件事,而他們不能。你希望他們把這三個詞組合在一起,並且你希望它們以文字形式出現。所以你需要引入另一對。

其次,當您設置cmdcmd設置爲單個字符串時,會發生解析。你想用它作爲單獨的元素,所以一個解決方案是使用一個數組變量。 sh有一個名爲@的數組,但由於您使用的是bash,因此您可以將您的cmd變量設置爲一個數組。

此外,爲了保持元素內的間距,在$i周圍放置雙引號是個好主意。如果你在foobar之間放置了多個空格,你會明白爲什麼。

$ cmd=(test "\"foo bar baz\"") 
$ for i in "${cmd[@]}"; do echo "$i"; done 

上分別SH和bash,特殊"[email protected]""${cmd[@]}"解析功能的更多詳細信息,請參見this question

更新

將這一想法在你的問題的更新,請嘗試將baz並調用foo這樣的:

$ baz=(a "\"$bar\"") 
$ foo "${baz[@]}" 
+0

看起來不錯,適用於我舉的例子。不幸的是,我不能將它應用到我的原始腳本。我更新了這個問題,也許你可以看看這個問題。 – multiholle 2012-04-26 20:39:52

0

爲什麼擺在首位報價呢?

for i in test "foo bar baz"; do echo $i; done 
+0

這工作,如果我直接把值在for循環,但如果我必須將值放入像我的示例中那樣的變量,該怎麼辦? – multiholle 2012-04-26 18:28:56