大括号扩展 {..}
是 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 脚本中使用大括号扩展。