在 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 脚本中使用花括号扩展。