目录
1. bash初识
Shell程序是独特的程序,这个程序提供了一个界面(就那黑乎乎的命令行界面,即Linux的终端界面),用户通过这个界面访问操作系统内核的服务,从而解析用户提供的命令。而bash(Bourne Again Shell)是众多Shell的一种,也是大部分Linux系统的默认Shell。
2. bash特性
2.1 命令相关
2.1.1 命令历史:history
shell进程会保存此前用户用过的命令,利用history命令可查看或者设置命令历史相关参数。
- history的一些常用选项:
history [OPTIONS]
-d:delete,删除历史命令中指定的命令;
-c:clear,清空命令历史;
-a:add,手动增加当前会话缓冲区的命令历史至历史文件中;
n:number,显示最近使用的n条历史命令
bash不单可以显示出命令历史,关键是还可以调用之前用过的命令,配合Tab键使用更佳。
- 调用历史命令:
!#:重复执行第#条命令
!!:重复执行上一条命令,这个比较常用
!string:重复执行最近一次以string(可变)开头的命令,这个比较常用
!$:调用上一条命令的最后一个参数,好吧,这个也好用
若要控制命令历史的记录方式,可在/etc/prfofile配置文件中更改HISTCONTROL环境变量,其中
- 控制命令历史的记录方式:
ignoredups:忽略重复的命令,连续且相同方为“重复”
ignorespace:忽略所有以空白开头的命令
ignoreboth:等于以上两者之和
其他history命令相关环境变量
- history命令相关环境变量:
HISTSIZE:命令历史记录的条数
HISTFILE:~/.bash_history,命令历史文件
HISTFILESIZE:命令历史文件 记录历史的条数
2.1.2 命令、路径补全:Tab
在谈及命令补全之前,首先我们得明白什么是命令。当我们发起命令的时候,请求内核将某个二进制程序运行为一个进程,此时程序由静态变为动态。命令本身也是一个可执行的程序文件,二进制格式的文件,也有可能会调用共享库文件。一般这些命令文件都保存在bin,sbin,lib这些目录中。
- bash中的执行命令可以分为两种
内部命令(builtin):内部命令没有具体的二进制文件,而是由内核提供;
外部命令:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻以给
定命令名命名的文件,第一次找到即为要执行的文件。
bash命令补全的方法,当命令按一半,发现不小心忘记命令全称或完全忘记了命令名时,只要按下命令前几个字母,再按下Tab键,即会显示用户给定的字符串所对应的命令,当用户给定的字符串为开头的命令不唯一时,则再次按Tab键就会给出以字符串开头的命令列表。Tap键用好了,事半功倍。
你也可以不敲字符串,直接按Tap键,会有惊喜哦。
路径补全是把用户给出的字符串当作路径开头,并在指定上级目录下搜索以指定的字符串开头的文件名,如果唯一,则直接补全,否则,再次Tab键会给出以字符串为开头的路径列表。
2.1.3 命令别名:alias
命令别名类似于个性化设置,一些常用且繁琐的命令可以在不和其他命令的名称冲突的情况下,给它设置成一个相对简单的命令。
举个例子,编辑网卡配置文件的时候,可定义如下别名
alias cdnet='cd /etc/sysconfig/network-scripts/'
但是如此定义的命令别名只对当前shell(当前用户)有效,即只配置在~/.bashrc中,若想对所有用户有效,则需要定义在配置文件中,即/etc/bashrc中。
2.1.4 命令哈希:hash
linux系统下会有一个hash表,当你刚开机时这个hash表为空,每当你执行过一条命令时,hash表会记录下这条命令的路径,就相当于缓存一样。第一次执行命令shell解释器默认的会从PATH路径下寻找该命令的路径,当你第二次使用该命令时,shell解释器首先会查看hash表,没有该命令才会去PATH路径下寻找,这样可以大大提高命令运行的速度。
hash [OPTIONS] ...
2.1.5 I/O重定向
输入/输出设备(I/O device)是计算机系统中的四大基本组成(运算器、控制器、存储器、输入及输出设备)之一,其重要性不言自明。在Linux中我们访问文件的时候是通过键盘输入某个文件名,{对于我们(用户)来说是是一个文件名},然后在Linux系统中通过内核来识别文件名所对应的一个数字(文件描述符,file descripter),从而访问文件。
Linux中一切皆文件,设备也可被描述为文件。一般在Linux系统定义的标准输入(stdin,standard input,命令在执行时所要的输入数据通过它来取得)设备为键盘,对应的文件描述符为0,对应句柄位置为/proc/slef/fd/0;标准输出(stdout,standard output,命令在执行后的输出结果从该端口送出)设备为显示器,对应的文件描述符为1,对应句柄位置为/proc/slef/fd/1;标准错误输出(stderr,standard error output,命令执行时的错误信息通过该端口送出)设备为显示器,对应的文件描述符为2,对应句柄位置为/proc/slef/fd/2。
标准输入/输出可以理解为Linux系统默认的输入/输出,而I/O重定向可以改变标准输入/输出的位置。
输出重定向: 简单来讲可以把本来输出到屏幕上的"hello,world"输出到随便哪个文件等作用。
COMMAND >NEW_POS,COMMAND >>NEW_POS
>:覆盖重定向,目标文件汇总的原有内容会被清除
>>:追加重定向,新内容会追加之目标文件尾部
set -C:禁止将内容覆盖输出至已有文件中,如果需要强制覆盖,则使用:>|
set +C:关闭覆盖已有文件的功能。2>:覆盖重定向错误输出流;2>>:追加重定向错误输出流
例子:
ls /etc/ > test.0
,表示将/etc/目录下的文件名覆盖输入至test.0中。
输入重定向:<,<<,输入重定向这个不常用,可起到读取文件内容等作用。
例子:
cat < test.1 > test.2
,这个命令表示从test.1文件中读取内容覆盖输出至test.2中;- 又如
tr 'a-z' 'A-Z' < /etc/fstab
,表示将/etc/fstab文件中的小写字母转化为大写字母。
**注意:**重定向字符(<,<<,>,>>)后面若没文件,即先执行字符后的内容,系统会自动先创建文件。
欲知更详细内容可参考
(https://www.cnblogs.com/divent/p/5773861.html)
(https://blog.csdn.net/freeking101/article/details/81212207)
2.1.6 管道及多命令执行
管道(|)可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。
COMMAND 1|COMMAND 2|COMMAND 3...
Linux中还有其他类似的多命令执行的方式,如
每个命令之间用;
隔开,其中各命令的执行结果不会影响其它命令的执行。也就是说各个命令都会执行, 但不保证每个命令都执行成功。
每个命令之间用&&
隔开,若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
每个命令之间用||
隔开 ,||
是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功 一条命令为止。
2.2 文件相关
2.2.1 文件名通配:glob
glob用于实现文件名通配,显示指定条件的文件,即如果显示以a开头的所有文件,至于a后面是什么我们不管,因此这里有一个通配,常用的通配符有*、?、[](可通过查询glob的帮助文档来查看有哪些通配符,man 7 glob)
glob通配符:
* 表示任意长度的任意字符
? 表示任意单个字符
[] 匹配指定范围内的任意单个字符
[0-9] 任意单个数字
[a-z] 任意单个字母(不区分字母的大小写)
[a-z0-9] 任意单个字母或数字
[^] 匹配指定范围外的任意单个字符
[:alnum:] 表示所有的字母和数字
[:alpha:] 表示所有的字母(不区分大小写)
[:digit:] 表示所有数字
[:lower:] 表示所有的小写字母
[:punct:] 表示所有的标点符号
[:space;] 表示所有的空白字符
[:upper:] 表示所有的大写字母
2.3 脚本编程相关
2.3.1 变量
bash中变量可分为
本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程包括当前的shell的子shell进程均无效;
环境变量:生效范围为当前shell进程及子进程;
局部变量:生效范围为当前shell进程中某代码片段(通常指函数);
位置变量:$1,…,$n,${10}来表示,用于放脚本在脚本代码中调用通过命令行传递给他的参数;
特殊变量:
$?:上个命令执行成功与否的结果
$0:表示命令本身
$#:传递给脚本参数的个数
$*:传递给脚本的所有参数
$@:引用传递给脚本的所有参数
2.4 其他
2.4.1 快捷键
bash的快捷键:
ctrl+I 相当于clear清屏
ctrl+a 跳转至命令开始处
ctrl+e 跳转至命令结尾处
ctrl+c 取消命令的执行
ctrl+u 删除命令行首至光标所在处的所有内容
ctrl+k 删除命令行所在处至命令行尾的所有内容