2014-01-06 50 views
2

有一個在http://www.tldp.org/LDP/abs/html/special-chars.html'Brace擴展'在Bash中如何工作?

$ echo {file1,file2}\ :{\ A," B",' C'} 
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C 

這是如何工作的一個例子嗎?
我改變這個命令象下面這樣:

$ echo {file1,file2}\ {\ A," B",' C'} 
file1 file2 A B C 
$ echo {file1,file2}\ -{\ A," B",' C'} 
file1 - A file1 - B file1 - C file2 - A file2 - B file2 - C 

爲什麼第一個命令並不像本例中的命令?
幫助!

我知道我已經引入了額外的空間。如果將一個額外的空間改爲別的(冒號,短劃線等),那麼一切都很好。 echo {「A」,「B」,'C'} \ {「D」,「E」,'F'} \ {「G」,「H」,'I' }在http://www.tldp.org/LDP/abs/html/special-chars.html。我想知道更多。

+0

如果您*轉義*增加了空間,一切都很好:'echo {file1,file2} \\ {\ A,「B」,'C'}' –

回答

4

爲什麼第一個命令不能像例子中的命令那樣工作?

因爲你引入了一個額外的空間:

#      |==> This is it! 
#      | 
$ echo {file1,file2}\ {\ A," B",' C'} 
file1 file2 A B C 
$ echo {file1,file2}\ {\ A," B",' C'} # This is probably what you expected! 
file1 A file1 B file1 C file2 A file2 B file2 C 

額外的空間使shell首先展開{file1,file2}然後{\ A," B",' C'}


Brace Expansion引用:

模式爲支架展開採取可選的前同步碼的形式, 後跟一個系列逗號分隔的字符串或一對之間的seqeunce 表達大括號,然後是可選的 後記。前導碼以大括號內包含的每個字符串作爲前綴,然後將附註附加到每個結果字符串 ,從左向右擴展。

當你介紹一個括號擴展後的空間(退格其次空間是一個空間!),下面的令牌不再被認爲是後記並單獨擴展。

+0

謝謝。我知道我已經引入了額外的空間。如果將一個額外的空間改爲別的(冒號,短劃線等),那麼一切都很好。在http中沒有關於'echo {「A」,「B」,「C」} \ {「D」,「E」,「F」} \ {「G」,「H」,「I」}的詳細信息://www.tldp.org/LDP/abs/html/special-chars.html。我想知道更多。 –

+0

@android_su請參閱上面的修改。我希望它澄清! – devnull

+0

@android_su試試這個:'echo {file,image} {0..4}。{raw,png,txt}'...你可以嘗試... –