2017-08-14 72 views
2

表達式{,}如何工作?尋找echo {,} foo的故障

我試着搜索SOF以及谷歌,甚至爲bash的手冊頁,但我還沒有能夠遇到這樣的解釋。

從擺弄這個表達式我發現它是某種字符串複製函數。

echo{,} foo 
>> echo echo foo 
echo foo{,} 
>> foo foo 

這個表達式是如何工作的?有沒有這個名字?另外,您能否提供使用此功能的實際示例?

+0

它被稱爲「支架擴展」。 '{,}'使用兩個空字符串,在我看來這有點奇怪。 –

+0

'mkdir example- {foo,bar,baz} .d'創建'example-foo.d','example-bar.d'和'example-baz.d'; 'mv foo {,。txt}'將'foo'重命名爲'foo.txt',而'mv foo {.txt,}'則反過來。使用應該是不言而喻的。這個墮落的案件仍然有效......那麼,爲什麼有人會不顧一切地拒絕呢? –

回答

2

「正常」 使用情況brace expansion是重複一個字符串的子串被大括號中的每個元素替換:

$ echo file.{txt,dat,log} 
file.txt file.dat file.log 

現在,如果列表中的元素之一是空的,字符串被打印成是:

$ echo file.{txt,dat,} 
file.txt file.dat file. 

一個流行的用例,這是重命名文件

$ mv -v file.txt{,.bak} 
'file.txt' -> 'file.txt.bak' 

這擴大到mv -v file.txt file.txt.bak,因爲第一個列表元素是空的。

現在,如果全部爲元素爲空,如{,},則該字符串的打印次數與列表元素的次數相同。

3

它叫做brace expansion

下面是一個簡單的解釋。

  • {,}將通過附加空字符串重複左邊相鄰的字符串兩次。
  • 同樣{,,}將重複左邊相鄰的字符串正好3次。
  • var{A,B}將返回varAvarB

,並且這些例子應該澄清更多:

echo foo{,,} 
foo foo foo 

echo foo{,1} 
foo foo1 

echo foo{1,2} 
foo1 foo2 

echo foo{,,} 
foo foo foo 

echo foo{1,2,3} 
foo1 foo2 foo3 

Link to the docs