使用 Shell 花括号展开

我们先来简单看下,什么是 Shell 花括号展开,在终端输入如下内容回车:

$ echo {1..5}
1 2 3 4 5

可以看到 {1..5} 被 Shell 展开为 1 2 3 4 5,我们再来看几个例子:

$ echo person_{1..5}
person_1 person_2 person_3 person_4 person_5

$ echo hello_{1..5}_word
hello_1_word hello_2_word hello_3_word hello_4_word hello_5_word

接下来是一个带有多个 {} 的例子:

$ echo a{1..5}b{3..6}c
a1b3c a1b4c a1b5c a1b6c a2b3c a2b4c a2b5c a2b6c a3b3c a3b4c a3b5c a3b6c a4b3c a4b4c a4b5c a4b6c a5b3c a5b4c a5b5c a5b6c

Shell 会根据 {} 的个数产生其笛卡尔积个串。{} 里面不仅可以由 .. 来表示一个序列中任一个字符,也可以使用逗号表示其列表中任一个字符,看这个例子:

$ echo a{1,8,b}c
a1c a8c abc

OK, 这就是 Shell 花括号展开式的作用啦,下面我们来看一个实际应用场景。

有这样一个需求,我们需要在一张数据表里面构造一些数据,假设是一张成绩表(users),分别有语文(chinese),数学(math),英语(english),这三个字段。手动往数据库里面当然是可以做到的,但是太费时间,用 PHP 写个循环插多条记录也比较快,但是至少还是得需要十几行代码,需要连数据库啊,需要在循环体里面插记录啊。这种情况 Shell 的花括号展开就可以派上用场啦。我们先写插入一条记录的 SQL:

insert user (chinese,math,english) values (80, 90, 70);

然后这样:

$ echo "insert user (chinese,math,english) values ("{80..90}", "{70..98}", "{68,70}");"

就会输出多条插入语句,在 MySQL 里面运行一下就 OK 啦。

有空多学一下这些技巧,虽然前期需要花点时间学习,但是一旦学会使用后在以后的工作中可以节约大量时间。

最近在看《The Linux Comand Line》这本书,这是一本开源的讲 Linux 命令行的书。以前都是用到什么看下手册或者在网上搜下,没有系统的学习过,书里面的内容大部分比较清楚(本人命令还算用得比较熟练啦),这两天感觉最大的收获就是知道了 Shell 花括号展开这个神器。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注