寻找 echo{,} foo 的分解

Looking for a breakdown of echo{,} foo

表达式 {,} 是如何工作的?

我尝试搜索 SOF 以及 google 甚至 bash 的手册页,但我还没有找到对此的解释。

通过摆弄表达式,我了解到它是某种字符串复制函数。

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

这个表达式是如何工作的?有这个名字吗?另外,能否提供一个实用的例子来说明这个功能的使用方法?

叫做brace expansion

这里有一个简单的解释。

  • {,} 将通过附加空字符串将左相邻字符串恰好重复 2 次。
  • 同样,{,,} 将恰好重复左相邻字符串 3 次。
  • var{A,B} 将 return 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

brace expansion 的 "normal" 用例是重复一个字符串,其子字符串替换为花括号中给出的列表的每个元素:

$ 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,因为第一个列表元素为空。

现在,如果 所有 元素都为空,如 {,},则字符串的打印次数与列表元素的数量一样多。