[Shell 脚本和编程 | 青训营笔记]
第三节课Shell 脚本和编程,讲师陈健,时长41min57s。
学习shell的价值
- Linux 服务器的基本操作和管理
- 前端 Node.is 服务的进程管理、问题排查、资源监控等运维操作
- 使用 shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署
一、Shell基础概念
1. 概念
- 终端、终端模拟器、TTY、Shell、Bash
2. 发展
- Ken Thompson (来自贝尔实验室) 在 1971 年为 UNIX开发了第一个 shell,称为 V6 shell
- Stephen Bourne 在贝尔实验室 为 V7 UNIX 所开发的 Bourneshell,即 sh
- 开源组织 GNU 为了取代 Bourne shell 开发的Bourne-Again shell,即 Bash
3. 构成
- 解释器、编程语言
二、语法和命令
1.变量
- 自定义变量
- 环境变量
- 系统环境变量
2.配置文件加载
login shell和non-login shell
source ~/.bashrc
3.运算符和引用
- 类型
- 算数运算符
- 逻辑运算符
- 比较运算符
- 引号
- 圆括号
- 命令连接
- 后台运行
4.管道
管道与管道符|,作用是将前一个命令的结果传递给后面的命令
- 语法:cmd1 | cmd2
- 要求:管道右侧的命令必须能接受标准输入才行, 比如 grep 命令, s、mv等不能直接使用,可以使用 xargs 预处理
- 注意: 管道命令仅仅处理 stdout, 对于 stderr 会予以忽略,可以使用 set-o pipefail 设置 shell 遇到管道错误退出
还有重定向、判断命令、分支语句、循环、函数、模块化、常用命令。
三、执行过程和原理
- 执行
- shell脚本一般以 .sh 结尾, 也可以没有, 这是一个约定; 第一行需要指定用什么命令解释器来执行
- 启动方式
- 执行过程
- 字符解析
- 识别换行符、分号() 做行的分割
- 识别命令连接符( && 管道) 做命令的分割
- 识别空格、tab符,做命令和参数的分割
- shell 展开,例如1..3? 解析为 12 3
- 重定向,将stdin、stdout、stderr的文件描述符进行指向变更
- 执行命令
- builtin 直接执行
- 非builtin 使用 SPATH 查找,然后启动了进程执行
- 收集状态并返回
- shell展开
- 大括号展开 (Brace Expansion) {...}
- 波浪号展开 (Tilde Expansion)
- 参数展开 (Shell Parameter Expansion)
- 命令替换 (Command Substitution)4 .
- 数学计算(Arithmetic Expansion) $((..))
- 文件名展开 (Filename Expansion) * ?[..] 外壳文件名模式匹配
四、调试和前端集成
调试
- 普通log,使用 echo、printf
- 使用 set 命令
- vscode debug插件
VsCode 配置
- shellman:代码提示和自动补全
- shellcheck:代码语法校验
- shell-format:代码格式化 4.Bash Debug: 支持单步调试
- 安装 vscode 插件
- 编写 launch.json文件
- 升级 bash 到 4.x 以上版本
前端集成
- node中通过 exec、spawn 调用 shell 命令
- shell 脚本中调用 node 命令
- 借助 zx 等库进行 javascript、shell script 的融合
- 借助 shell 完成系统操作,文件io、内存、磁盘系统状态查询等
- 借助 nodejs 完成应用层能力, 网络io、计算等
课后加强练习方可熟练掌握。