花括号扩展可以让我们按照花括号里的模式创建一连串字符串。
例如:
echo Love_{a,b,c}_Forever
可以看到打印了:
Love_a_Forever Love_b_Forever Love_c_Forever
由于默认模式下,不能忽略空格,这里使用_
代替空格。
这里的开头部分Love_
被称为前导字符(preamble),结尾部分_Forever
被称为附言(postscript)。
我们还可以按顺序输出设定范围内的字母或者数字,例如:
echo {1..10}
终端里将打印出:
1 2 3 4 5 6 7 8 9 10
打印字母的时候有点特殊问题,我们先来看下面按序输出大写的A到Z的字母:
echo {A..Z}
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
再来看全是小写字母a到z:
echo {a..z}
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
目前为止都很正常,但是我们输入:
echo {A..z}
这时候打印出的是:
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 [ ] ^ _ ` 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
可以看到先输出全部大写字母,然后出现一堆符号,然后再全部小写字母。很奇怪对吧,等会再解释为什么这样,我们再来看输入:
echo {a..Z}
这时候返回的是:
a ` _ ^ ] [ Z
更加奇怪了是不是,这是为什么呢?
我们来看一个东西,ASCII码表:
这时候我们看65号的A到122号的z之间,除了大小写字母之外,是不是出现了那堆奇怪的符号。这是因为花括号扩展的顺序是按照ASCII码表的顺序输出的。
这时候我们也就可以理解echo {a..Z}
为什么会返回那段字符串了,因为在ASCII码表中其实是倒序的。
不过经过测试可以发现,由于其他符号有已经被赋予特殊含义,就只有大小写字母之间会出现这个问题。需要在使用中注意哦!
花括号扩展支持嵌套,例如:
echo c{a{1,4},b{2,3}}d
ca1d ca4d cb2d cb3d
花括号扩展普遍应用于创建一系列文件或者目录,这时候就可能需要按照时间来命名,手动输入一个个输入太麻烦了,这时候也可以使用花括号扩展,如下:
mkdir {2018..2021}-{01..12}
2018-1 2018-2 2018-3 2018-4 2018-5 2018-6 2018-7 2018-8 2018-9 2018-10 2018-11 2018-12 2019-1 2019-2 2019-3 2019-4 2019-5 2019-6 2019-7 2019-8 2019-9 2019-10 2019-11 2019-12 2020-1 2020-2 2020-3 2020-4 2020-5 2020-6 2020-7 2020-8 2020-9 2020-10 2020-11 2020-12 2021-1 2021-2 2021-3 2021-4 2021-5 2021-6 2021-7 2021-8 2021-9 2021-10 2021-11 2021-12
可以看到01
自动变成1
,这样不能让月份都为两位,不好看。可以这样:
mkdir {2018..2021}-0{1..9} {2018..2021}-{10..12}
2018-01 2018-02 2018-03 2018-04 2018-05 2018-06 2018-07 2018-08 2018-09 2018-10 2018-11 2018-12 2019-01 2019-02 2019-03 2019-04 2019-05 2019-06 2019-07 2019-08 2019-09
2019-10 2019-11 2019-12 2020-01 2020-02 2020-03 2020-04 2020-05 2020-06 2020-07 2020-08 2020-09 2020-10 2020-11 2020-12 2021-01 2021-02 2021-03 2021-04 2021-05 2021-06 2021-07 2021-08 2021-09 2021-10 2021-11 2021-12