在 Bash Shell 中使用大括号展开

大括号扩展 {..} 是 Linux 中未充分利用但最棒的 shell 特性之一。

您可以使用它来打印数字和字母序列。 将两个整数或字母相加 两个点 在花括号中,看看魔术。

以最简单的形式,把它当作 example:

echo {1..10}

你能猜出输出吗?

1 2 3 4 5 6 7 8 9 10

输出序列打印在同一行中,它们之间有一个空格。

让我再给你一些大括号扩展的例子,以便你更好地理解它的功能。

大括号扩展示例

假设您想获得从 7 到 1 的反向数字序列。

[email protected]:~$ echo {7..1}
7 6 5 4 3 2 1

您可以添加前导零:

[email protected]:~$ echo {01..10}
01 02 03 04 05 06 07 08 09 10

您可以使用大括号扩展的形式 {x..y..z} 在以 z 递增的同时生成从 x 到 y 的值。

假设您想要一个偶数序列,直到数字 15。

[email protected]:~$ echo {0..15..2}
0 2 4 6 8 10 12 14

或者得到一个奇数序列:

[email protected]:~$ echo {1..15..2}
1 3 5 7 9 11 13 15

您可以执行任何增量步骤:

[email protected]:~$ echo {100..1000..99}
100 199 298 397 496 595 694 793 892 991

它也可以取负数:

[email protected]:~$ echo {3..-4}
3 2 1 0 -1 -2 -3 -4

⚠️大括号中的点之间不能有空格。 否则,扩展将不起作用。

使用字母序列

到目前为止,我只使用了数字序列。 但是您也可以使用它来生成字母序列。

[email protected]:~$ echo {A..H}
A B C D E F G H

你也可以反过来:

[email protected]:~$ echo {H..A}
H G F E D C B A

或者进入增量或减量步骤:

[email protected]:~$ echo {H..A..2}
H F D B

您也可以以相同的方式使用小写字母:

[email protected]:~$ echo {a..f}
a b c d e f

大括号展开的实际使用

到目前为止,我刚刚展示了使用大括号扩展创建序列的示例 bash 壳。

但它们不是实际的例子。 你可以把它用于一些实际的好用途。 让我分享几个这样的例子。

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

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

[email protected]:~/test$ touch file_{1..10}.txt
[email protected]:~/test$ ls
file_10.txt  file_2.txt  file_4.txt  file_6.txt  file_8.txt
file_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} 模式,但它是你应该知道的有用的模式。

-p cp 命令的选项保留文件属性,如所有权、时间戳等。

使用多个大括号

您可以使用多个大括号来创建具有相似名称和不同扩展名的文件。 那只是一个 example 使用多个大括号。

[email protected]:~/test$ touch {a,b,c}.{hpp,cpp}
[email protected]:~/test$ ls
a.cpp  a.hpp  b.cpp  b.hpp  c.cpp  c.hpp
[email protected]:~/test$

在路径中使用大括号扩展

假设您有一个类似的目录结构,只有轻微的变化。 大括号扩展在这里会有所帮助。

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

上面的命令等价于:

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

不是所有的东西都可以消耗

那不用说了。 您正在寻找创建序列,因此它应该是可以创建为序列的东西。 如果你使用一个奇怪的组合,它不会被消耗。

[email protected]:~$ echo {1..Z}
{1..Z}

不能使用小数点。

[email protected]:~$ echo {1..5..0.5}
{1..5..0.5}

对于一些奇怪的组合,它可能会产生奇怪的结果:

[email protected]:~$ echo {a..F}
a ` _ ^ ]  [ Z Y X W V U T S R Q P O N M L K J I H G F

结论

当您不熟悉它时,支撑扩展会感觉很麻烦。 我的意思是,手动输入它们需要多长时间?

但是一旦它进入你的肌肉记忆,它就会将你的 Linux 命令技能提升到另一个层次。

所以,尽量在你的 shell 脚本中使用大括号扩展。