Bash 花括号扩展


Catalogue
  1. 1. {..} - 序列拓展
    1. 1.1. 数字序列拓展
    2. 1.2. 字母序列拓展
    3. 1.3. 渐进(递增/递减)序列拓展
  2. 2. {,} - 列表拓展
  3. 3. 实际运用
    1. 3.1. 创建具有相似名称的多个文件
    2. 3.2. 创建备份文件
    3. 3.3. 在路径中使用花括号扩展
  4. 4. 异常情况
  5. 5. 参考资料

{} 并没有什么实际的含义,但是可以作为 Brace expansion(大括号扩展),经常用于产生各种组合。


{..} - 序列拓展

用于生成数字和字母序列,输出序列打印在同一行中,它们之间有空格。大括号中的点之间不能有空格。否则,扩展将无法工作。

数字序列拓展

基本数字序列。可以是正序或逆序:

1
2
3
4
5
6
7
8
9
# 数字
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
# 数字逆序
$ echo {7..1}
7 6 5 4 3 2 1
# 可以是负数
$ echo {3..-4}
3 2 1 0 -1 -2 -3 -4

添加前导零:

1
2
3
4
5
# 添加前导零
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {001..010}
001 002 003 004 005 006 007 008 009 010

字母序列拓展

1
2
3
4
5
6
7
8
# 字母
$ echo {A..H}
A B C D E F G H
$ echo {a..f}
a b c d e f
# 字母逆序
$ echo {H..A}
H G F E D C B A

渐进(递增/递减)序列拓展

渐进序列,用 {x..y..z} 生成从 x 到 y 的值,同时增加 z。

1
2
3
4
5
6
7
8
9
10
11
12
# 偶数数列
$ echo {0..15..2}
0 2 4 6 8 10 12 14
# 奇数数列
$ echo {1..15..2}
1 3 5 7 9 11 13 15
# 字母递增或递减步骤
$ echo {H..A..2}
H F D B
# 任意渐进数
$ echo {100..1000..99}
100 199 298 397 496 595 694 793 892 991

{,} - 列表拓展

对大括号中的以逗号分割的字段列表进行拓展。

1
2
3
4
$ echo {foo,bar}
foo bar
$ echo {1,2,3}
1 2 3

实际运用

创建具有相似名称的多个文件

创建具有特定名称模式的文件:

1
2
3
4
$ touch bar-{1..10}.txt
$ ls
bar-10.txt bar-2.txt bar-4.txt bar-6.txt bar-8.txt
bar-1.txt bar-3.txt bar-5.txt bar-7.txt bar-9.txt

可以使用多个花括号来创建具有相似名称和不同扩展名的文件:

1
2
3
$ touch {a,b,c}.{hpp,cpp}
$ ls
a.cpp a.hpp b.cpp b.hpp c.cpp c.hpp

拓展的嵌套使用:

1
2
$ touch {ex{1..3},ex4}.sh    
ex1.sh ex2.sh ex3.sh ex4.sh

创建备份文件

在编辑配置文件时,通常需要进行备份。一般惯例是在原始文件名中添加 .bak 扩展名,这表示它是给定文件名的备份。

1
2
3
4
5
6
7
8
9
# 将httpd.conf备份为httpd.conf.bak
cp httpd.conf{,.bak}
# 将httpd.conf重命名为httpd.conf.bak
mv httpd.conf{,.bak}
# 将httpd.conf重命名为httpd.bak
mv httpd{.conf,.bak}
# 按添加日期后缀备份
$ cp httpd.conf{,`date +.%F`}
httpd.conf.2025-05-06

在路径中使用花括号扩展

假设您有一个类似的目录结构,只需稍作更改。花括号扩展在这里很有用。

1
2
3
mv project/{new,old}/dir/file
# 上述命令相当于:
mv project/new/dir/file project/old/dir/file

异常情况

不是所有的东西都可以使用扩展。你想要创造序列,所以它应该是可以被创造成序列的东西。如果你使用一个奇怪的组合,它就不可以使用扩展。

1
2
3
4
5
6
7
8
# 几乎没有意义的序列
$ echo {1..H}
1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H
$ echo {a..K}
a ` _ ^ ] \ [ Z Y X W V U T S R Q P O N M L K
# 不能使用小数点
$ echo {1..5..0.5}
{1..5..0.5}

参考资料