使用Unix Shells进行大括号扩展

来源:互联网 发布:淘宝客刷销量有什么用 编辑:程序博客网 时间:2024/06/03 19:58

最近,我发现了一个很大的功能,最近的Shells支持。它被命名为支架扩展。我偶尔使用它,但不知道它的行为和它的力量是什么。
下面是一个例子:

$ echo I{like,love,hate}chocolateIlikechocolate 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/CarsImages/FamilyImages/HouseImages/VacationsMoviesMusic

生成序列

如果你来自命令式(例如,如果你知道例如C或甚至使用Java循环),你可能熟悉3个参数循环控制表达式。你也知道写是多么无聊,特别是在Shell:

$ for ((i=1; i<=3; i++)); do echo $i; done123

使用大括号序列,写作更短,更易读:

$ 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. 变量扩展在括号列表中工作,但不在序列表达式内部。


总之,大括号扩展是一个非常强大的功能,可以节省你的时间,当你必须创建目录,应用权限等。此外,好消息是,它几乎所有最近的Shells支持。

0 0
原创粉丝点击