依然很多,分成两部分来做咯,部分搞不出来的图表就贴图片了~
学习shell的价值:
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
课程准备
- 一台安装了 linux 系统的物理机或者云主机,可运行 shell 脚本
- 本地的 vscode 安装 Bash Debug 插件,并升级 bash 到4.x以上
- Npm 全局安装 zx 依赖
Shell基础概念
概念
层次:物理终端 => 软件终端 tty => 终端模拟器 => shell
终端最开始指的是获取用户输入并输出的物理设备, 比如电传打字机。
在 linux 中,终端模拟器是接收用户输入、输出结果的终端仿真软件, 比如 mac terminal、 iterm2 等,更强输入辅助功能、画面绘制输出的模拟终端器;而 tty 变成一个虚拟概念,是linux的一个程序,每个终端模拟器关联一个虚拟 tty,和内核打交道。 我们可以在终端模拟器中输入 tty 查看关联到的虚拟 tty。
bash是shell的一种具体实现,可以理解成实例和类的关系。
发展
Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell
Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh
开源组织GNU为了取代Bourne shell开发的Bourne-Again shell,即 Bash
Bash 是 sh 的超集,可以直接执行大部分 sh 脚本。
构成
Shell不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制。
语法和命令
变量
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前 shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前 shell 及其子 shell | export、declare -x | - |
| 系统环境变量 | 所有 shell | 启动加载 | - |
自定义变量
declare [+/-] 选项 变量
具体参数:
| 选项 | 含义 |
|---|---|
| - | 给变量设定类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组类型 |
| -i | 将变量声明为整数型 |
| -x | 将变量声明为环境变量 |
| -r | 将变量声明为只读变量 |
| -p | 显示指定变量的被声明的类型 |
系统环境变量
| 变量名 | 含义 | 常见操作 |
|---|---|---|
| $0 | 当前shell名称/脚本名称 | 2等可以获取到传入参数 |
| $# | 传入脚本的参数变量 | if [$# -gt 1] |
| $* | 传入脚本的所有参数 | - |
| $? | 上条命令执行的状态码 | if [$? -eq 0]; |
| $PS1 | 命令提示符 | export PS1 = "\u@\h \w>" |
| $HOME | 用户主文件夹 | cd ~ |
| $PATH | 全局命令的搜索路径 | PATH=$PATH:[新增路径] |
Bash Shell 在启动时总要配置其运行环境, 例如初始化环境变量、设置命令提示符、指定系统命令路径等。
配置文件加载
-
通过系统用户登录默认运行的shell
-
非登录交互式运行shell
-
执行脚本运行非交互式shell
如果取得 bash 需要完整的登录流程,称为 login shell,比如 ssh 远程登录一台主机;
否则称为 non-login bash, 比如在原来的 bash 中执行 bash 开启子进程、 执行一些外部命令。
如果修改了配置文件,不会立即生效,需要我们重启终端或者执行 source 命令。
运算符和引用
用 cmd & 实现让命令在后台运行。
管道
管道与管道符│ ,作用是将前一个命令的结果传递给后面的命令
语法: cmd1 | cmd2
要求: 管道右侧的命令必须能接受标准输入才行,比如 grep命令,ls、mv等不能直接使用,可以使用xargs预处理
注意: 管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell遇到管道错误退出。
也就是两个命令之间的互通。
重定向
输出重定向符号
>: 覆盖写入文件
>>: 追加写入文件
2>: 错误输出写入文件
&>: 正确和错误输出统一写入到文件中
输入重定向符号
<
<<
每个 shell 命令在执行时都会打开三个文件描述符,文件描述符 0、1、2 分别对应 stdin、stdout、stderr,这三个文件描述符默认指向终端输入、终端输出,那么当命令需要获取输入的时候,它会去读取 fd0,当要输出的时候它会像 fd1、fd2写入,改变这些描述符指向的行为叫做重定向。
判断命令
注意:
- 中括号前后要有空格符;
[和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串- 中括号内的变量,最好都是用引号括起来。
[[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则。
分支语句
循环
函数
function 可有可无。
注意shell自上而下执行代码,函数需要提前定义。
模块化
即在当前shell执行函数文件。
source [函数库的路径]