开始深入学习一下shell

概念

shell是命令解析器.shell位于操作系统和应用程序之间,是他们二者的接口,负责:把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序.

分类

1
2
3
4
5
6
7
shell类别               易学性          可移植性        编辑性      快捷性
Bourne Shell(sh) 容易 好 较差 较差
Konrn Shell(ksh) 较难 较好 好 较好
Bourne Again(Bash) 难 较好 好 好
POSIX Shell(psh) 较难 好 好 较好
C Shell(csh) 较难 差 较好 较好
TC Shell(tcsh) 难 查 好 好

现在linux中主流的shell是 bash

shell的语法类型

1
2
3
Shell的两种主要语法类型有Bourne 和 C, 这两种语法彼此不兼容. Bourne家族主要包括sh, ksh, Bash, psh, zsh; C家族主要包括csh,tchsh.
我们可以通过 /etc/shells 文件来查询linux 支持的shell .
shell是唯一一个不需要考虑效率的语言,只要能实现功能即可.

shell脚本执行方法

1
2
3
4
执行shell 脚本,在linux中, 一般是这样两种方法
1.赋予执行权限,直接执行(可以用绝对路径, 也可以用相对路径 ), 这是最常用的shell脚本执行方法.
2.通过Bash调用执行脚本 bash xxx.sh

Bash基本功能

历史命令

1
2
3
4
5
history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令保存文件. 如果不收工指定历史命令保存文件, 则放入默认历史命令保存文件 ~/.bash_hsitory 中

历史命令的注意事项

1
2
3
4
5
6
7
8
9
10
11
12
我们用 history 查看的历史命令和 ~/.bash_history  文件中保存的历史命令是不同的, 那是因为当前登陆操作的命令并没有直接写入 ~./bash_history 文件, 而是保存在缓存当中的.需要等用户注销之后,缓存中的命令才会写入 ~/.bash_history文件. 
如果我们需要把缓存中的命令直接写入 ~/.bash_history文件, 而不等用户注销时再写入, 就需要使用 "-w" 选项了.
history -w #把缓存中的命令直接写入 ~/.bash_history文件

此时再去查看~/.bash_history 文件, 历史命令就和 history 命令查询的一致了.

如果需要清空历史命令, 只需要执行 history -c
一般情况下,都不需要清除, 因为这个命令会清空缓存中记录的命令和 ~/.bash_history 文件 中记录的命令.
但是会在极少数的情况下,需要清空命令, 例如刚给mysql 设置了密码等, 为了保密.



命令别名

1
2
3
4
5
6
命令格式:
alias 查询命令别名
alias 别名='原命令'

但是通过命令修改的,只是临时有效.
如果要永久生效, 需要修改 ~/.bashrc 文件, 改完之后,还要 source 该文件才生效

命令执行时的具体顺序

1
2
3
4
5
第一顺位执行用绝对路径或者相对路径执行的命令
第二顺位执行别名
第三顺位执行Bash的内部命令
第四顺位执行按照 $PATH环境变量定义的目录查找顺序找到的第一个命令

bash 常用快捷键

1
2
3
4
5
6
ctrl + a  光标移动到行首,    ctrl + u 剪切/删除光标之前的命令 ,  ctrl + y 粘贴  
ctrl + k 删除光标之后的内容,这个用的不多,不用去记.
ctrl + d 退出当前终端.



输入输出重定向

bash 的标准输入输出

1
2
3
4
5
设备        设备名          文件描述符      类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

输出重定向

1
2
3
4
5
6
7
8
9
10
类型                    符号                作用
标准输出重定向 命令>文件 以覆盖的方式,把命令的正确输出 输出到指定的文件或者设备中
命令>>文件 以追加的方式,把命令的正确输出 输出到指定的文件或者设备中


标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出 输出到指定的文件或者设备中
错误命令 2>>文件 以追加的方式,把命令的错误输出 输出到指定的文件或者设备中



实际应用

1
2
但是一般情况下,我们也不知道哪些命令一定不会报错,所以我们一般需要 不管标准输出还是错误输出,都要保存
这个 命令>>文件1 2>>文件2 正确的输出和错误的输出分别追加到指定的文件中

输入重定向

1
2
3
4
5
6
7
8
wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行

偶尔用来统计文件的个数, 例如 ls | wc -l

多命令执行符

1
2
3
4
多命令执行符        格式            作用
; 命令1 ;命令2 多个命令之间顺序执行,命令之间没有任何逻辑关系
&& 命令1 && 命令2 命令1正确执行,则命令2 才会执行; 如果命令1执行不正确, 则命令2不会执行
|| 命令1 || 命令2 命令1 执行不正确,则命令2才会执行; 如果命令1执行正确,则命令2不会执行

管道符(行提取命令)

1
2
3
4
5
6
7
8
9
10
grep   [选项]    "搜索内容"   文件名
选项:
-A 数字: 列出符合条件的行,并 列出后续的n行
-B 数字: 列出符合条件的行, 并列出前面的n 行
-c: 统计找到符合条件的字符串的次数
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
-color=auto 搜索出的关键字用颜色现在(默认就使用)

find 和 grep 的 区别

1
2
find 是用来查找文件的, 如果要模糊匹配,就要使用通配符
grep 是 用来查找字符串的,如果要模糊查询,就要使用正则表达式