在 Bash Shell 中使用括号扩展
括号扩展{..}
是 Linux 中利用最少但却非常棒的 shell 功能之一。
你可以使用它来打印数字和字母序列。在花括号中添加两个整数或字母,并用两个点分隔,然后看看会发生什么。
以最简单的形式为例:
echo {1..10}
你能猜出输出结果吗?
1 2 3 4 5 6 7 8 9 10
输出序列打印在同一行,并且它们之间有一个空格。
让我给你举一些大括号扩展的例子,以便你更好地理解它的功能。
括号扩展示例
假设您想要获取从 7 到 1 的反向数字序列。
abhishek@LHB:~$ echo {7..1}
7 6 5 4 3 2 1
您可以添加前导零:
abhishek@LHB:~$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
您可以使用括号扩展的形式来{x..y..z}
生成从 x 到 y 的值,同时以 z 为增量。
假设您想要一个直到数字 15 的偶数序列。
abhishek@LHB:~$ echo {0..15..2}
0 2 4 6 8 10 12 14
或者获取一个奇数序列:
abhishek@LHB:~$ echo {1..15..2}
1 3 5 7 9 11 13 15
您可以采取任何渐进步骤:
abhishek@LHB:~$ echo {100..1000..99}
100 199 298 397 496 595 694 793 892 991
它也可以取负数:
abhishek@LHB:~$ echo {3..-4}
3 2 1 0 -1 -2 -3 -4
使用字母序列
到目前为止,我只使用了数字序列。但您也可以使用它来生成字母序列。
abhishek@LHB:~$ echo {A..H}
A B C D E F G H
你也可以反向操作:
abhishek@LHB:~$ echo {H..A}
H G F E D C B A
或者采取递增或递减的步骤:
abhishek@LHB:~$ echo {H..A..2}
H F D B
您也可以按照相同的方式使用小写字母:
abhishek@LHB:~$ echo {a..f}
a b c d e f
括号扩展的实际用法
到目前为止,我仅展示了在 bash shell 中使用括号扩展创建序列的示例。
但它们不是实用的例子。你可以用它们来做一些实际的好事情。让我分享几个这样的例子。
创建多个具有相似名称的文件
创建具有特定名称模式的文件:
abhishek@LHB:~/test$ touch file_{1..10}.txt
abhishek@LHB:~/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}
模式,但很有用,你应该知道。
使用多个括号
您可以使用多个括号来创建名称相似但扩展名不同的文件。这只是使用多个括号的一个例子。
abhishek@LHB:~/test$ touch {a,b,c}.{hpp,cpp}
abhishek@LHB:~/test$ ls
a.cpp a.hpp b.cpp b.hpp c.cpp c.hpp
abhishek@LHB:~/test$
在路径中使用括号扩展
假设您有一个类似的目录结构,但只有一点变化。括号扩展在这里会很有用。
mv project/{new,old}/dir/file
上述命令相当于:
mv project/new/dir/file project/old/dir/file
并非所有事物都可以扩展
这不言而喻。您要创建序列,因此它应该是可以创建序列的东西。如果您使用奇怪的组合,它将不会被扩展。
abhishek@LHB:~$ echo {1..Z}
{1..Z}
不能使用小数点。
abhishek@LHB:~$ echo {1..5..0.5}
{1..5..0.5}
对于某些奇怪的组合,它可能会产生奇怪的结果:
abhishek@LHB:~$ 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 脚本中使用括号扩展。