花括號(hào)擴(kuò)展(Brace expansion) {..} 是 Linux 中使用率很高的一個(gè) shell 功能。 你可以使用它打印數(shù)字或字母序列,將兩個(gè)整數(shù)或字母使用花括號(hào)中的兩個(gè)點(diǎn)分隔開,然后會(huì)看到神奇的結(jié)果。
我們舉個(gè)最簡(jiǎn)單的例子,看如下代碼:
echo {1..10}
上述一行 echo 代碼的輸出將會(huì)是什么呢? 如下:
1 2 3 4 5 6 7 8 9 10
輸出結(jié)果,會(huì)打印在同一行中,中間使用空格隔開。
為了讓大家可以更好的理解它的功能,我們接下來列舉幾個(gè)其他例子。
一些例子
假如我們想要得到一個(gè)從 7 到 1 的數(shù)字序列:
$ echo {7..1}
7 6 5 4 3 2 1
可以添加前綴 0:
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
可以使用 {x.. y.. z} 形式的花括號(hào)來擴(kuò)展生成從 x 到 y 的值,遞增(步長)為 z。 比如我們想要打印 15 以內(nèi)的偶數(shù)序列,如下:
$ echo {0..15..2}
0 2 4 6 8 10 12 14
或者奇數(shù)序列:
$ echo {1..15..2}
1 3 5 7 9 11 13 15
步長可以指定為任何數(shù)值:
$ echo {100..1000..99}
100 199 298 397 496 595 694 793 892 991
也可以采用負(fù)數(shù):
$ echo {3..-4}
3 2 1 0 -1 -2 -3 -4
注意:花括號(hào)中的點(diǎn)之間 不能有空格 ,否則,擴(kuò)展將不起作用。
使用字母序列
我們上面的例子,介紹的是使用數(shù)字序列。 但是也可以使用它生成字母序列。 看下面的例子:
$ echo {A..H}
A B C D E F G H
也可以將順序反過來:
$ echo {H..A}
H G F E D C B A
或者指定步長:
$ echo {H..A..2}
H F D B
或者使用小寫字母:
$ echo {a..f}
a b c d e f
實(shí)際應(yīng)用
上面我們介紹了花括號(hào)擴(kuò)展的具體用法,下面來介紹一些關(guān)于它的實(shí)際應(yīng)用。
創(chuàng)建一系列文件
我們可以利用花括號(hào)擴(kuò)展來創(chuàng)建一系列具有相同文件名規(guī)則的文件,看下面的例子:
$ touch file_{1..10}.txt
$ 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
創(chuàng)建備份文件
當(dāng)我們?cè)诰庉嬇渲梦募r(shí),一般建議先對(duì)其進(jìn)行備份,按照大多數(shù)人的習(xí)慣,是在原始文件名中添加 .bak 擴(kuò)展名,這表示它是對(duì)原文件的一個(gè)備份。
比如:
cp -p long_filename.txt long_filename.txt.bak
現(xiàn)在我們來使用花括號(hào)擴(kuò)展來完成這個(gè)工作,如下代碼:
cp -p long_filename.txt{,.bak}
是的,這里的 {,text} 不是上面的那種 {X.. Y} 的模式,但是你需要知道有這樣一個(gè)用法的存在。
$ cp -p long_filename.txt{,.bak}
$ ls
long_filename.txt long_filename.txt.bak
上述 cp 命令的 -p 選項(xiàng)表示需要保留原文件的屬性,比如所有權(quán)、時(shí)間戳等。
使用多個(gè)花括號(hào)
可以使用多個(gè)花括號(hào)來創(chuàng)建具有相似名稱和不同擴(kuò)展名的文件,看下面的例子:
$ touch {a,b,c}.{hpp,cpp}
$ ls
a.cpp a.hpp b.cpp b.hpp c.cpp c.hpp
在路徑中使用或括號(hào)擴(kuò)展
假設(shè)有兩個(gè)路徑,其目錄結(jié)構(gòu)是類似的,只有很少的一部分不一樣(比如中間某個(gè)文件夾名稱不同),這個(gè)時(shí)候,花括號(hào)擴(kuò)展會(huì)非常有用。 看下面代碼:
mv project/{new,old}/dir/file
其相當(dāng)于:
mv project/new/dir/file project/old/dir/file
并非所有內(nèi)容都可擴(kuò)展
這是不言而喻的。 如果你希望創(chuàng)建一個(gè)序列,給出的條件應(yīng)該是可以創(chuàng)建成序列的東西。 如果你使用的是一個(gè)很奇怪的組合,將不能被擴(kuò)展。 比如:
$ echo {1..Z}
{1..Z}
另外,也不能使用小數(shù):
$ echo {1..5..0.5}
{1..5..0.5}
一些奇怪的組合,也會(huì)生成奇怪的結(jié)果:
$ 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
當(dāng)你剛開始接觸花括號(hào)擴(kuò)展時(shí),會(huì)覺得它很麻煩。 但是,手動(dòng)打字會(huì)更耗費(fèi)時(shí)間。 一旦你熟悉了它,那你的 Linux 技能會(huì)更上一個(gè)臺(tái)階。
-
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208722 -
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68237 -
Shell
+關(guān)注
關(guān)注
1文章
363瀏覽量
23259
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論