Linux学习笔记(四):bash特性

什么是bash

说到bash,就不得不提到shell。
在Linux中,shell是直接和内核交互的最低层的应用程序从而实现用户和计算机交互。shell有很多种,而bash则是其中的一员。bash的功能相对气筒shell来说功能更为强大,又是开源软件,因此成为了大多数Linux系统的默认shell。

当用户登录系统后,系统就为当前用户建立了一个进程用来运行bash,不用的用户之间互不影响。

bash特性

作为一款功能强大的shell,bash提供了很多特性,可以大大简化我们的操作,其中大致包括:

  1. 命令历史、命令补全
  2. 管道和重定向
  3. 命令别名
  4. 命令行编辑
  5. 命令行展开
  6. 文件名通配
  7. 变量
  8. 编程

命令行编辑

在bash的输入过程中,可以通过下面的命令实现命令行编辑:
CTRL+A 跳转到行首
CTRL+E 跳转到行尾
Ctrl+←/→ 跳转到上/下一个字段
CTRL+U 删除光标到行首
CTRL+K 删除光标到行尾
CTRL+L 清屏

命令历史

bash会自动记录执行过的命令保存在缓冲区中,直接使用上下箭头就可以查看。而在用户退出的时候,bash会将这些命令保存在~/.bash_history下,使用history命令就可以查看。
history 查看命令历史
常用参数:
-c #清空历史
-d [offset] [n] #删除offset位置的n条历史
-w #写入缓存到历史文件

此外也有一些使用技巧可以调用命令历史:
!n #执行命令历史中的第n条命令
!n #执行命令历史中的第n条命令
!-n #执行命令历史中的倒数第n条命令
!! #执行上一条命令
![string] #执行命令历史中最近一个以string开头的命令
!$ #引用前一个命令的最后一个参数,也可以按Esc再按.,又或者使用ALT+.,都可以实现相同的功能

命令补全,路径补全

当在输入命令或者路径的时候,bash可以尝试补全命令或路径,当可能唯一的时候,按下Tab键就会自动补全,而当有多个可能的时候,连续按两次Tab则会打印出所有可能以给出建议。
不过内部命令不能被自动补全,因为命令补全的机制是搜索PATH路径下的可执行文件,而内部命令已经直接储存在缓存中了。

命令别名

bash提供了alias命令让用户可以为命令设置别名以方便操作。语法如下:
alias CMDALIAS=’COMMAND [options] [arguments]’
在shell中定义的别名仅在当前的shell的生命周期中有效,也不会影响到其他shell进程。而在bash的配置文件中定义别名可以实现永久和全局有效。

alias #不带参数直接使用可以显示当前生效的所有别名
alias [CMDALIAS] #取消别名

命令替换

使用$(COMMAND)或者`COMMAND`(反引号)可以把命令中的某个子命令替换为执行过程。比如:

echo "current DIR is $(pwd)"
current DIR is /root 

其中的pwd命令就被执行并输出了结果。

bash中对不同的引号有不同的释义:
单引号(’):强引用,不进行变量替换;
双引号(”):弱引用,可以实现变量替换;
反引号(`):命令替换,和$(COMMAND)相同。

因此,如果把上面例子中的双引号换成单引号,pwd命令就不会被执行了

echo 'current DIR is $(pwd)'
current DIR is $(pwd)

文件名通配

和DOS下的文件名通配类似,比如
*:任意长度的任意字符
?:任意单个字符
[]:匹配指定范围内的任意单个字符

此外,还有可以用下面的表达式来匹配一些特定的字符
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]: 大写字母
[:alpha:]: 大小写字母
[:digit:]: 数字
[:alnum:]: 数字和大小写字母