在 Bash Shell 中使用花括号扩展

花括号扩展 {..} 是 Linux 中最未被充分利用但又非常棒的 Shell 特性之一。

你可以用它来打印数字和字母序列。添加两个整数或用花括号中的两点分隔的字母,然后看看它的神奇之处。

举个最简单的例子:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {1..10}

你能猜到输出吗?

示例如下:

1 2 3 4 5 6 7 8 9 10

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

我再举几个花括号扩展的例子以便你们更好地理解它的作用。

花括号扩展示例

假设你想要得到一个从 7 到 1 的逆序列。

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {7..1}
7 6 5 4 3 2 1

您可以添加前导零:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {01..10}
01 02 03 04 05 06 07 08 09 10

你可以用{x..y..z}生成从 x 到 y 的值,同时增加 z。

假设你想要一个直到 15 的偶数序列。

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {0..15..2}
0 2 4 6 8 10 12 14

或者得到一个奇数序列:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {1..15..2}
1 3 5 7 9 11 13 15

你可以采取任何渐进的步骤:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {100..1000..99}
100 199 298 397 496 595 694 793 892 991

它也可以是负数:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {3..-4}
3 2 1 0 -1 -2 -3 -4

大括号中的点之间不能有空格。否则,扩展将无法工作。

使用字母顺序

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {A..H}
A B C D E F G H

你也可以反过来:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {H..A}
H G F E D C B A

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {H..A..2}
{H..A..2}

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {a..f}
a b c d e f

花括号扩展的实际应用

前文我们展示了在 bash shell 中使用花括号扩展创建序列的示例。

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

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

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ touch linuxmi_{1..10}.txt
                                                                           
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ ls                       
linuxmi         linuxmi_2.txt  linuxmi_5.txt  linuxmi_8.txt
linuxmi_10.txt  linuxmi_3.txt  linuxmi_6.txt  linuxmi_9.txt
linuxmi_1.txt   linuxmi_4.txt  linuxmi_7.txt  www.linuxmi.com

创建备份文件

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ cp -p linuxmi_1.txt linuxmi_1.txt.bak

很酷吧,现在让我们使用花括号扩展:

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ cp -p linuxmi_2.txt{,.bak}

是的!这个  {,text} 不是通常的 {X..Y} 模式,但您应该知道它是一个有用的模式。

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

使用多个花括号

可以使用多个花括号来创建具有相似名称和不同扩展名的文件。这只是使用多个花括号的一个例子。

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ touch {a,b,c}.{hpp,cpp}
                                                                           
┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ ls
a.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

不是所有的东西都可以使用扩展

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {1..Z}                                                        1 ⨯
1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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

不能使用小数点。

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ echo {1..5..0.5}
{1..5..0.5}

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

┌──(linuxmi㉿linuxmi)-[~/www.linuxmi.com]
└─$ 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 脚本中使用花括号扩展。

来源:在 Bash Shell 中使用花括号扩展

THE END