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
演示如下: