最近,我发现了一个很大的功能,最近的Shells支持。它被命名为支架扩展。我偶尔使用它,但不知道它的行为和它的力量是什么。
下面是一个例子:
$ echo I{like,love,hate}chocolate
Ilikechocolate Ilovechocolate Ihatechocolate
在这个例子中,{like,love,hate}有一个特殊的含义:它是一个由大括号分隔的字符串元素的列表,其中的元素用附加的单词扩展。如输出所示,并取每个String元素通过用其值替换列表来创建一个新单词。
好吧,这很有趣,但它可以用于一个具体的例子?答案是肯定的。假设您需要在同一目录中创建多个文件夹。我知道的最简单的方法是移动到所需的文件夹,然后对每个目录使用mkdir命令:
$ cd ~
$ mkdir -p Images
$ mkdir -p Movies
$ mkdir -p Music
以前的命令序列可以写得很快,但需要手指体操使用键盘快捷键。使用支架扩展,前面的示例可以轻松地一行:
$ mkdir -p ~/{Images,Movies,Music}
嵌套支架扩展
大括号列表可以组成。例如,上述示例可以扩展为快速创建文件夹的层次结构:
$ mkdir -p ~/{Images/{Cars,Family,House,Vacations},Movies,Music}
它将在您的主目录中创建以下文件夹:
Images/Cars
Images/Family
Images/House
Images/Vacations
Movies
Music
生成序列
如果你来自命令式(例如,如果你知道例如C或甚至使用Java循环),你可能熟悉3个参数循环控制表达式。你也知道写是多么无聊,特别是在Shell:
$ for ((i=1; i<=3; i++)); do echo $i; done
1
2
3
使用大括号序列,写作更短,更易读:
$ for i in {1..3}; do echo $i; done
序列表达式的一般语法是{START..END..INCREMENT},其中START和END是必需的整数或单个字符,但INCREMENT是可选的整数值(默认为1)。这样的表达式通过INCREMENT步骤从START到END开始生成整数或字符序列。这样,列出9和17之间的奇数就像写:
$ echo {9..17..2}
9 11 13 15 17
虽然枚举字母表并不复杂:
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
限制
1. 有效的括号扩展必须至少包含逗号或序列表达式。 不能有空格。2. 变量扩展在括号列表中工作,但不在序列表达式内部。