在 Bash shell 中使用花括号扩展 {..}

系统 Linux
花括号扩展(Brace expansion) {..} 是 Linux 中使用率很高的一个 shell 功能。

​你可以使用它打印数字或字母序列,将两个整数或字母使用花括号中的两个点分隔开,然后会看到神奇的结果。

我们举个最简单的例子,看如下代码:

echo

上述一行 echo 代码的输出将会是什么呢?如下:

1 2 3 4 5 6 7 8 9 10

输出结果,会打印在同一行中,中间使用空格隔开。

为了让大家可以更好的理解它的功能,我们接下来列举几个其他例子。

一些例子

假如我们想要得到一个从 7 到 1 的数字序列:​

$echo7 6 5 4 3 2 1

可以添加前缀 0:​

$echo01 02 03 04 05 06 07 08 09 10

可以使用 {x..y..z} 形式的花括号来扩展生成从 x 到 y 的值,递增(步长)为 z。比如我们想要打印 15 以内的偶数序列,如下:​

$echo0 2 4 6 8 10 12 14

或者奇数序列:

$echo1 3 5 7 9 11 13 15

步长可以指定为任何数值:​

$echo100 199 298 397 496 595 694 793 892 991

也可以采用负数:​

$echo3 2 1 0 -1 -2 -3 -4


注意:花括号中的点之间不能有空格,否则,扩展将不起作用。

使用字母序列

我们上面的例子,介绍的是使用数字序列。但是也可以使用它生成字母序列。看下面的例子:​

$echoA B C D E F G H

也可以将顺序反过来:​

$echoH G F E D C B A

或者指定步长:​

$echoH F D B

或者使用小写字母:​

$echoa b c d e f

实际应用

上面我们介绍了花括号扩展的具体用法,下面来介绍一些关于它的实际应用。

创建一系列文件

我们可以利用花括号扩展来创建一系列具有相同文件名规则的文件,看下面的例子:​

$ touch file_{1..10}.txt$ lsfile_10.txt  file_2.txt  file_4.txt  file_6.txt  file_8.txtfile_1.txt   file_3.txt  file_5.txt  file_7.txt  file_9.txt

创建备份文件

当我们在编辑配置文件时,一般建议先对其进行备份,按照大多数人的习惯,是在原始文件名中添加 .bak 扩展名,这表示它是对原文件的一个备份。

比如:

cp -p long_filename.txt long_filename.txt.bak

现在我们来使用花括号扩展来完成这个工作,如下代码:

cp -p long_filename.txt{,.bak}

是的,这里的 {,text} 不是上面的那种 {X..Y} 的模式,但是你需要知道有这样一个用法的存在。

$ cp -p long_filename.txt{,.bak}$ lslong_filename.txt long_filename.txt.bak

上述 cp 命令的 -p 选项表示需要保留原文件的属性,比如所有权、时间戳等。

使用多个花括号

可以使用多个花括号来创建具有相似名称和不同扩展名的文件,看下面的例子:​

$ touch {a,b,c}.{hpp,cpp}$ lsa.cpp  a.hpp  b.cpp  b.hpp  c.cpp  c.hpp

在路径中使用或括号扩展

假设有两个路径,其目录结构是类似的,只有很少的一部分不一样(比如中间某个文件夹名称不同),这个时候,花括号扩展会非常有用。看下面代码:

mv project/{new,old}/dir/file

其相当于:

mv project/new/dir/file project/old/dir/file

并非所有内容都可扩展

这是不言而喻的。如果你希望创建一个序列,给出的条件应该是可以创建成序列的东西。如果你使用的是一个很奇怪的组合,将不能被扩展。比如:​

$echo{1..Z}

另外,也不能使用小数:​

$echo{1..5..0.5}

一些奇怪的组合,也会生成奇怪的结果:​

$echoa ` _ ^ ]  [ Z Y X W V U T S R Q P O N M L K J I H G F

当你刚开始接触花括号扩展时,会觉得它很麻烦。但是,手动打字会更耗费时间。一旦你熟悉了它,那你的 Linux 技能会更上一个台阶。

责任编辑:庞桂玉 来源: TIAP
相关推荐

2019-04-22 14:39:05

BashLinux命令

2019-04-15 11:10:34

Bash方括号命令行

2019-03-18 15:53:11

BashLinux花括号

2020-10-13 19:04:58

Bash信号捕获Shell脚本

2017-04-05 13:17:26

LinuxShellvi

2023-07-12 14:13:03

BashLinux

2022-12-14 10:08:00

BashLinux

2022-01-16 07:48:33

脚本Bash 工具

2022-12-02 14:30:24

Bash脚本数组

2023-07-20 15:37:50

Bash数组

2023-03-14 08:17:40

Bash编程语言

2012-08-20 10:43:50

IBMdW

2020-04-09 10:18:51

Bash循环Linux

2020-10-29 07:09:07

编程花括号程序员

2023-09-15 13:31:00

Linuxattr

2022-11-03 20:38:01

CMD命令Go

2022-11-23 08:14:42

bash 脚本test 命令

2019-02-12 15:47:42

Bash尖括号命令

2021-05-11 07:50:31

BashShell脚本

2019-12-18 09:45:24

BashshellLinux
点赞
收藏

51CTO技术栈公众号