
Bash特性
Bash是Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4起至macOS Mojave都将它作为默认shell,而自macOS Catalina,默认Shell以zsh取代。
Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。
Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。
总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。因此,本文中就将介绍Bash的这些特性。(虽然本文是用zsh为例,但是这些特性一般是通用的)
1. 花括号{}展开
A. 基本用法
Bash会自动对花括号的内的内容进行展开。例如:
echo {change1,change2,change3}
相当于下面三个命令
echo change1
echo change2
echo change3
注意,逗号之间不能有空格
得到的输出如下:

B. 省略写法
我们其实可以省略相同的地方,只展开不同的地方。例如上面的例子中,执行的三条命令的输出内容的前半部分都是change。所以我们可以使用下述的省略写法
echo change{1,2,3}
同样,Bash展开后其实就是三条命令
echo change1
echo change2
echo change3
运行结果如下:

C. 有序省略
我们其实不仅可以省略相同的内容,对于括号内需要展开的内容也可以进行省略。我们使用..来进行有顺序省略。
具体语法为{start..end}
例如:
echo change{1..10}
展开后得到下述命令
echo change1
echo change2
echo change3
echo change4
echo change5
echo change6
echo change7
echo change8
echo change9
echo change10
运行结果如下:

当然,只要是顺序的,包括数字序、字母序都可以进行有序省略。例如
echo change_{a..d}
运行结果为:

D. 有序省略——指定间隔
类似于Python切片的写法,我们在有序省略中也可以指定间隔,语法为{start..end..leap}
例如:
echo change{1...20..2}
结果为:

E. 有序省略——对齐
有序省略输出数字序的时候,我们可以在前面补0来实现对齐,例如
echo change{01..10}
运行结果为:

我们补充多少个0,就会对齐多少位。所以我们补充三个0,就会对齐三位
echo change{001..10}

2. 命令历史
A. history
Bash中可以使用history查看历史命令。虽然这个是老掉牙了,但是为了命令历史的完整性,还是介绍一下history命令
history
结果如下:

B. !行号
Bash中我们可以使用!行号来执行之前命令。行号是使用history时显示的行号
history
然后执行1353行的命令

C. !!
Bash中!!表示执行上一条命令
!!

3. 快捷键
Bash中支持很多快捷键,这些快捷键都很使用,下面将介绍这些快捷键。
A. 移动到行首:Ctrl+a
Bash中使用Ctrl+a快捷键将光标移动到行首。记忆的方法就是a是26个字母中的第一个,所以Ctrl+a就是移动到行首。
演示如下:

B. 移动到行尾:Ctrl+e
Bash中使用Ctrl+e快捷键将光标移动到行尾。记忆的方法就是e是End的缩写
演示如下:

C. 删除光标前字符:Ctrl+u
Bash中使用Ctrl+u快捷键将光标签的文字删除。
演示如下:

D. 删除光标后字符:Ctrl+k
Bash中使用Ctrl+k快捷键将光标后的字符删除。
演示如下:

E. 清屏:Ctrl+l
Bash中使用Ctrl+l快捷键清除整个屏幕。效果等同于clear
演示如下:
